【问题标题】:remove() method of arraylist is leading to shrinking size of arraylist [duplicate]arraylist 的 remove() 方法导致 arraylist 的大小缩小 [重复]
【发布时间】:2017-02-14 15:05:18
【问题描述】:

我了解到,当我们从 ArrayList 中删除 Object 时,它的大小不会减小。

我尝试了下面的代码来测试这个,但发现大小减小了。谁能纠正或向我解释一下?

package collections;

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {  
public static void main(String[] args) {  
    //Creating list of Books  
    List<Book> list=new ArrayList<Book>();  
    //Creating Books  
    Book b1=new Book(101,"Let us C","Yashwant Kanetkar","BPB",8);  
    Book b2=new Book(102,"Data Communications & Networking","Forouzan","Mc Graw Hill",4);  
    Book b3=new Book(103,"Operating System","Galvin","Wiley",6);  
    //Adding Books to list  
    list.clear();
    list.add(b1);  
    list.add(b2);  
    list.add(b3); 
    list.contains(b3);
    int size= list.size();
    System.out.println(size);
    list.remove(b3);
    int size1= list.size();
    System.out.println(size1);      
}  
}  

【问题讨论】:

  • 我读到,当我们从 Arraylist 中删除一个对象时,它的大小并没有减小...你从哪里读到的?
  • 你在哪里读到的?也许你读过一些关于数组而不是 ArrayLists 的东西?
  • 也许底层存储不会减小它的大小(这将是一个实现细节),但 size 方法将始终反映列表中包含的实际元素数量,如 javadocs 中所述.

标签: java arraylist


【解决方案1】:

您可能读到 ArrayList 使用的 支持数组 的大小并没有减小,这是真的。如果将 100 个元素放在 ArrayList 中,它将有一个大小至少为 100 的支持数组。即使在 remove() 元素之后,该数组的大小也保持不变。要释放该内存,可以使用trimToSize() 方法:

public void trimToSize()
Trims the capacity of this ArrayList instance to be the list's current size. An application can use this operation to minimize the storage of an ArrayList instance.

来自https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#trimToSize()

【讨论】:

    【解决方案2】:

    有大小和容量。

    1) 大小 - 列表中元素的总数。删除元素后会减少。

        list.add(b1);  
        list.add(b2);  
        list.add(b3); 
        System.out.println(list.size());//size is 3
        list.remove(b3);
        System.out.println(list.size());//size is 2 after remove
    

    2) 容量 - 列表中元素的“单元格”总数。删除元素后不会减少。

    List<Book> list1 = new ArrayList<>(3); //there is 3 "cells" for books
    List<Book> list2 = new ArrayList<>(); //there is 10 "cells" for books(default value)
    

    你仍然可以这样做:

    List<Book> list1 = new ArrayList<>(3); // 3 "cells" for books
    list.add(b1); //capacity = 3; size = 1; 
    list.add(b2); //capacity = 3; size = 2; 
    list.add(b3); //capacity = 3; size = 3; 
    list.add(b4); //capacity = (3 * 3) / 2 + 1 = 5; size = 4;
    

    您可以在列表中添加 4 个元素和 3 个“单元格”,因为当容量不足时,JVM 会自动增加列表的容量(公式 = (oldCapacity * 3) / 2 + 1 )。

    There是下一个代码的图片:

    List<String> list = new ArrayList<>();
    list.add("0");
    list.add("1");
    

    您可以阅读有关容量的更多信息there

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2014-03-16
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多