我正在尝试理解 Java。
假设我有一个ArrayList
大小为 50 并预先填充了一些名称。
假设我从数组列表中删除了第三个和第四个元素。我的数组列表会怎样?会重新安排吗?如果我尝试访问现在已删除的第 3 和第 4 个元素,它会返回 null 吗?
我正在尝试理解 Java。
假设我有一个ArrayList
大小为 50 并预先填充了一些名称。
假设我从数组列表中删除了第三个和第四个元素。我的数组列表会怎样?会重新安排吗?如果我尝试访问现在已删除的第 3 和第 4 个元素,它会返回 null 吗?
不,您要删除的元素之后的元素将向左移动(昂贵的操作),因此您不会有任何漏洞。
作为旁注:如果删除第 3 个元素,则第 5 个元素将向左移动,因此如果之后删除第 4 个元素,则改为删除起始集合的第 5 个元素。要删除两个连续的元素,您应该提供两次相同的索引。
它们将被重新排列和移动。
如果您希望它们返回null
,只需将要删除的元素显式设置为 null 而不是删除它们。
你为什么不自己尝试一下?
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
for(int i = 0; i < list.size(); i++) System.out.println("index " + i + ": " + list.get(i));
System.out.println();
list.remove(0); // remove "A"
for(int i = 0; i < list.size(); i++) System.out.println("index " + i + ": " + list.get(i));
输出:
index 0: A
index 1: B
index 2: C
index 3: D
index 4: E
index 5: F
index 6: G
index 0: B
index 1: C
index 2: D
index 3: E
index 4: F
index 5: G
您实际上有两种选择:
final List<Character> x = new ArrayList<Character>(asList('a', 'b', 'c', 'd'));
x.set(1, null); // removes an element without shifting
x.remove(0); // removes an element with shifting
System.out.println(x);
印刷
[null, c, d]
数组列表元素将重新排列
ArrayList 是可由索引引用的项目的连续列表。因此,当您删除一个项目时,所有后续项目都将被移动。
元素将被移动。
请参阅 ArrayList 删除的 javadoc:
java.util.ArrayList
public E remove(int index)
Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).
Specified by:
remove in interface List
Overrides:
remove in class AbstractList
Parameters:
index - the index of the element to be removed
Returns:
the element that was removed from the list
Throws:
IndexOutOfBoundsException -
根据remove 方法的 javadoc,其余条目将向后移动,因此没有间隙。