java从数组列表中删除元素
谁能解释一下remove()
的ArrayList
是如何工作的
public class ListTest {
public static void main(String[] args) {
List list = new ArrayList();
for(int i=0;i<10;i++)
{
list.add(i);
}
System.out.println("Size of list before removing :"+list.size());
for(int i=0;i<list.size();i++)
{
list.remove(i);
}
System.out.println("Size of list after removing all elements :"+list.size());
}
}
输出
删除前列表的大小:10
删除所有元素后的列表大小:5
我做错了什么
# 1 楼答案
因为
ArrayList
是一个dynamically resizing array数据结构,这意味着它被实现为一个初始(默认)固定大小的数组。当这个空间被填满时,数组将被扩展到一个两倍大小的数组。这项手术成本很高,所以你需要尽可能少的手术当你从
ArrayList
中删除元素时,他不会缩小大小这是你需要知道的一件事
如果要在删除项目后刷新内存,请使用
此方法将此
ArrayList
实例的容量修剪为列表的当前大小。应用程序可以使用此操作最小化ArrayList
实例的存储# 2 楼答案
因为ArrayList本质上是动态的。它的remove函数必须维护这个属性,并且每次调用它时,它都会动态地减小ArrayList的大小。 Remove只需将列表中的元素移动一个索引,即可移除元素并每次减小列表的大小
列表的大小不是静态的,每次从列表中删除一个元素时,它都会不断减小。在你的情况下,最初列表的大小是10。当从列表中删除第一个元素时,大小将减少到9。当i=4时,循环列表的大小将为5。现在进一步增加i将违反循环的
因此,当列表大小仍然为5时,循环将在那里终止
只需在remove's for循环中添加下面提到的一行,就可以更好地理解
# 3 楼答案
list.remove(i);
移动被删除元素后面的所有元素的索引。因此,在调用list.remove(0)
之后,位置1处的前一个元素将移动到位置0,循环将永远不会删除它,因为i是递增的。正如您所看到的,循环只会删除一半的元素此循环将删除所有元素:
# 4 楼答案
要在迭代集合时安全地从集合中删除,应该使用迭代器。例如: 列表名称=
其中,根据文档删除数组列表
这意味着如果在依赖equals()的情况下使用,它会删除匹配出现的第一个实例
# 5 楼答案
如上所述,从ArrayList#remove文档中可以看出,删除元素ArrayList后,它会自动调整大小,因此ArrayList实际上每次都在缩小,因此FOR循环只运行了一半的时间
输出:
如果为了理解目的而检查^ {< CD1>},那么你可以考虑使用^ {CD2>},一次可以令人信服地清空你的^ {CD3>}。p>
此外,请检查
ArrayList#remove
的重载方法,它允许您使用索引以及实际本身删除元素,但在每种删除情况下,ArrayList都会调整大小希望这有帮助