4

我正在尝试理解 Java。

假设我有一个ArrayList大小为 50 并预先填充了一些名称。

假设我从数组列表中删除了第三个和第四个元素。我的数组列表会怎样?会重新安排吗?如果我尝试访问现在已删除的第 3 和第 4 个元素,它会返回 null 吗?

4

9 回答 9

19

不,您要删除的元素之后的元素将向左移动(昂贵的操作),因此您不会有任何漏洞。

作为旁注:如果删除第 3 个元素,则第 5 个元素将向左移动,因此如果之后删除第 4 个元素,则改为删除起始集合的第 5 个元素。要删除两个连续的元素,您应该提供两次相同的索引。

于 2012-06-25T11:19:38.593 回答
7

它们将被重新排列和移动。

如果您希望它们返回null,只需将要删除的元素显式设置为 null 而不是删除它们。

于 2012-06-25T11:20:28.127 回答
5

你为什么不自己尝试一下?

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
于 2012-06-25T11:23:41.160 回答
3

您实际上有两种选择:

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]
于 2012-06-25T11:24:59.730 回答
2

数组列表元素将重新排列

于 2012-06-25T11:19:56.947 回答
1

ArrayList 是可由索引引用的项目的连续列表。因此,当您删除一个项目时,所有后续项目都将被移动。

于 2012-06-25T11:20:23.110 回答
1

元素将被移动。

请参阅 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 -
于 2012-06-25T11:21:03.233 回答
1

根据remove 方法的 javadoc,其余条目将向后移动,因此没有间隙。

于 2012-06-25T11:23:02.320 回答
0

通常您使用java 集合作为动态存储,而不定义大小。

List<String> list = new ArrayList<String>(); //dynamic

对于静态预定义集合,您使用java 数组

String[] array = new String[50]; //static
于 2012-06-25T11:22:35.200 回答