任何人都可以解释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
我做错了什么?
答案 0 :(得分:1)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<article class="linkWrapper" data-group="1">
<a href="#">...</a>
</article>
<article class="linkWrapper" data-group="1">
<a href="#">...</a>
</article>
<article class="linkWrapper" data-group="2">
<a href="#">...</a>
</article>
<article class="linkWrapper" data-group="2">
<a href="#">...</a>
</article>
<article class="linkWrapper" data-group="2">
<a href="#">...</a>
</article>
移动删除元素后面的所有元素的索引。因此,在调用list.remove(i);
之后,位置1的前一个元素将移动到位置0,并且您的循环将永远不会将其删除,因为i会递增。如您所见,您的循环将仅删除一半元素。
此循环将删除所有元素:
list.remove(0)
答案 1 :(得分:0)
要在迭代时安全地从集合中删除,您应该使用Iterator。例如: 列表名称= ....
Iterator<Integer> i = names.iterator();
while (i.hasNext()) {
Integer s = i.next();
// must be called before you can call i.remove() // Do something i.remove(); }
根据文档
删除数组列表的位置该集合包含一个或多个此类元素。 集合,如果它存在(可选操作)。更正式地说,如果集合包含一个或多个这样的元素,则删除一个元素(o == null?e == null:o.equals(e))。
这意味着如果在依赖equals()的情况下使用它并删除匹配事件的第一个实例。
答案 2 :(得分:0)
删除此列表中指定位置的元素。转移任何 左边的后续元素(从索引中减去一个)。
如上所述,从ArrayList#remove文档中删除元素后,ArrayList将自行调整大小,因此您的ArrayList实际上每次都在缩小,因此FOR循环只运行了一半。
for(int i=0;i<list.size();i++)
{
System.out.println(i);
list.remove(i);
}
输出:
0
1
2
3
4
如果您正在检查remove
是否有理解,那么您可以考虑使用ArrayList#clear
,这样可以一次性令人信服地清空ArrayList
。
另外,检查ArrayList#remove
的重载方法,它允许您使用索引以及实际本身删除元素,但在每个删除情况下,ArrayList都会调整大小。
希望这有帮助!
答案 3 :(得分:0)
因为ArrayList
是dynamically resizing array数据结构,这意味着它被实现为具有初始(默认)固定大小的数组。填充后,阵列将扩展为双倍大小。此操作非常昂贵,因此您希望尽可能少。
int newCapacity = (oldCapacity * 3)/2 + 1;
当你从ArrayList
中移除元素时 - 他没有缩小尺寸。
这是你需要知道的一件事。
如果要在删除项目后刷新内存,请使用
public void trimToSize()
此方法将此ArrayList
实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList
实例的存储。
答案 4 :(得分:0)
由于ArrayList本质上是动态的。它的remove函数必须维护这个属性,并且每次调用时它都会动态地减小ArrayList的大小。 删除只是将List中的元素移动一个索引,以便删除元素并每次减少列表的大小。
列表的大小不是 静态 ,每次从列表中删除元素时它都会继续减少。在你的情况下,最初列表的大小是10.当你从列表大小中删除第一个元素减少到9.当你的i = 4 in循环列表的大小将是5.现在进一步增加i将违反循环的条件
i< list.size()
因此,当列表大小仍为5时,循环将终止。
只需在remove's for循环中添加下面提到的单行,以便更好地理解。
System.out.println("list size is :"+list.size() +" and i is "+i);