有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我做错了什么


共 (5) 个答案

  1. # 1 楼答案

    因为ArrayList是一个dynamically resizing array数据结构,这意味着它被实现为一个初始(默认)固定大小的数组。当这个空间被填满时,数组将被扩展到一个两倍大小的数组。这项手术成本很高,所以你需要尽可能少的手术

    int newCapacity = (oldCapacity * 3)/2 + 1;
    

    当你从ArrayList中删除元素时,他不会缩小大小
    这是你需要知道的一件事

    如果要在删除项目后刷新内存,请使用

    public void trimToSize()
    

    此方法将此ArrayList实例的容量修剪为列表的当前大小。应用程序可以使用此操作最小化ArrayList实例的存储

  2. # 2 楼答案

    因为ArrayList本质上是动态的。它的remove函数必须维护这个属性,并且每次调用它时,它都会动态地减小ArrayList的大小。 Remove只需将列表中的元素移动一个索引,即可移除元素并每次减小列表的大小

    列表的大小不是静态的,每次从列表中删除一个元素时,它都会不断减小。在你的情况下,最初列表的大小是10。当从列表中删除第一个元素时,大小将减少到9。当i=4时,循环列表的大小将为5。现在进一步增加i将违反循环的

    i< list.size()
    

    因此,当列表大小仍然为5时,循环将在那里终止

    只需在remove's for循环中添加下面提到的一行,就可以更好地理解

    System.out.println("list size is :"+list.size() +" and i is "+i);
    
  3. # 3 楼答案

    list.remove(i);移动被删除元素后面的所有元素的索引。因此,在调用list.remove(0)之后,位置1处的前一个元素将移动到位置0,循环将永远不会删除它,因为i是递增的。正如您所看到的,循环只会删除一半的元素

    此循环将删除所有元素:

    while(list.size()>0)
    {
        list.remove(0);
    }
    
  4. # 4 楼答案

    要在迭代集合时安全地从集合中删除,应该使用迭代器。例如: 列表名称=

    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(); }
    

    其中,根据文档删除数组列表

    the collection contains one or more such elements. collection, if it is present (optional operation). More formally, removes an element esuch that (o==null ? e==null : o.equals(e)), if the collection contains one or more such elements.

    这意味着如果在依赖equals()的情况下使用,它会删除匹配出现的第一个实例

  5. # 5 楼答案

    Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).

    如上所述,从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
    

    如果为了理解目的而检查^ {< CD1>},那么你可以考虑使用^ {CD2>},一次可以令人信服地清空你的^ {CD3>}。p>

    此外,请检查ArrayList#remove的重载方法,它允许您使用索引以及实际本身删除元素,但在每种删除情况下,ArrayList都会调整大小

    希望这有帮助