代码之家  ›  专栏  ›  技术社区  ›  Ismail Marmoush

arraylist中的参数(int初始容量)是什么意思?

  •  16
  • Ismail Marmoush  · 技术社区  · 14 年前

    参数是什么意思 (int initialCapacity) 在一个 ArrayList ,我以为这是元素的数量,但当我这样做时,它不起作用:

    public class MyClass {
        private ArrayList<Integer> arr;
        public MyClass(int n_elements) {
            arr = new ArrayList<Integer>(n_elements);
        }
    }
    
    4 回复  |  直到 7 年前
        1
  •  36
  •   Patrick angularsen    14 年前

    它是初始容量,即 ArrayList 将分配作为项目的内部存储。

    阵列列表 可以包含“任意数量的项目”(只要您有足够的内存),并且在进行大型初始插入时,您可以知道 阵列列表 分配一个更大的存储空间,当它试图为下一个项目分配更多的空间时,从开始不要浪费CPU周期。

    例子:

    ArrayList list = new ArrayList<Integer>(2);
    list.add(1); // size() == 1
    list.add(2); // size() == 2, list is "filled"
    list.add(3); // size() == 3, list is expanded to make room for the third element
    
        2
  •  8
  •   Carl    14 年前

    实际上,它是你可以添加到 ArrayList 在它在后台调整大小之前,如果使用正确,可以节省一些周期。

        3
  •  6
  •   Escay    7 年前

    容量是对象内部存储的大小。内部存储总是大于或等于列表的size()(以便它可以包含所有元素)。

    public class Main {
        public static void main(String[] args) throws Exception {
    
            ArrayList<Integer> arr = new ArrayList<>();
            System.out.println("initial size = " + arr.size()); // 0
            System.out.println("initial capacity = " + getCapacity(arr));
    
            for (int i = 0; i < 11; i++)
                arr.add(i);
    
            System.out.println("size = " + arr.size()); // 11
            System.out.println("capacity = " + getCapacity(arr));
        }
    
        static int getCapacity(ArrayList<?> l) throws Exception {
            Field dataField = ArrayList.class.getDeclaredField("elementData");
            dataField.setAccessible(true);
            return ((Object[]) dataField.get(l)).length;
        }
    }
    

    运行此命令将提供:

    initial size = 0
    initial capacity = 10
    size = 11
    capacity = 16
    
        4
  •  3
  •   Community rohancragg    7 年前

    在引擎盖下面, ArrayList 本质上是 dynamic array . 每次使用 new Arraylist<>() 现在所发生的是,创建一个数组来保存要存储其默认容量的值, not to be confused with size ,是10。

    每次添加一个将增大容量的值时,都会创建一个新的数组,该数组的容量大于前一个容量的150%,其中复制了前一个数组的内容。

    如果您对结果列表的大小有一个大致的了解,或者是确定的,但是希望在数组上使用array list所提供的灵活性,那么您可以设置容量,以防止创建新数组、复制新数组中旧数组的内容以及获取去掉旧的——否则会增加与列表大小成比例的出现次数。