从阵列列表中删除元素

时间:2015-06-28 10:58:43

标签: java arraylist collections core

任何人都可以解释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

我做错了什么?

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)

因为ArrayListdynamically 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);