【问题标题】:What's meant by parameter (int initial capacity) in an arraylist数组列表中的参数(int初始容量)是什么意思
【发布时间】:2011-05-09 12:27:36
【问题描述】:

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

public class MyClass {
    private ArrayList<Integer> arr;
    public MyClass(int n_elements) {
        arr = new ArrayList<Integer>(n_elements);
    }
}

【问题讨论】:

    标签: java initialization arraylist


    【解决方案1】:

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

    ArrayList 可以包含“任意数量的项目”(只要您有足够的内存),并且在进行大型初始插入时,您可以告诉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
    

    【讨论】:

    • 我反对第一句中的“默认”一词。 default 数字是在您在括号中输入数字时分配的大小。
    • @Carl:你是对的。将其更改为 初始容量,以符合 Java 文档。
    • 准确地说:“任意数量的项目”仅限于 Integer.MAX,因为 java 中的数组是由整数索引的(从 Java 6 开始)。
    • @Willi:好吧,如果您要分配超过 2^31-1 个值,我相信您遇到了内存问题,而不是 ArrayList 容量不足。
    • Integer.MAX 大约是 20 亿(不是 2^31-1),它占用了 16GB 的 RAM(在 64 位机器上),今天还不算大。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      容量是对象内部存储的大小。内部存储总是大于或等于列表的 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】:

        在底层,ArrayList 本质上是一个dynamic array。每次使用 new Arraylist&lt;&gt;() 实例化时,都会创建一个数组来保存您要存储的值,其默认容量 not to be confused with size 为 10。

        每次您添加一个会使大小超出容量的值时,都会创建一个新数组,其容量是前一个容量的 150% 以上,其中复制了前一个数组的内容。

        如果您大致了解结果列表的大小,或者可以确定但希望在数组上使用 arraylists 所提供的灵活性,您可以设置容量以防止创建新数组、复制列表内容的重复过程新数组中的旧数组,并摆脱旧数组 - 否则会增加与列表大小成正比的出现次数。

        【讨论】:

          【解决方案5】:

          请原谅我的英语。问的问题是'ArrayList中参数初始容量的含义或功能是什么?如果我没记错的话。我解释说,每当创建一个数组时,默认容量为 10。我解释说,当添加的数量超过存储桶时,数组会自行调整大小。在时间复杂度的情况下,我建议应该添加完美容量。 通过 Geeks for Geeks 查看此代码:

          导入 java.util.*;

          班级学生{

              public static void main(String[] arg) throws Exception
              {
                  try {
          
                      
                      ArrayList<String> numbers
                              = new ArrayList<String>(3);
          
                     
                      numbers.add("10");
                      numbers.add("20");
                      numbers.add("30");
          
                      // Print the ArrayList
                      System.out.println("ArrayList: " + numbers);
          
                      
                      System.out.println(
                              "Increasing the capacity of ArrayList numbers to store up to 500 elements.");
          
                      numbers.ensureCapacity(500);
          
                      System.out.println(
                              "ArrayList numbers can now store upto 500 elements.");
                  }
          
                  catch (NullPointerException e) {
                      System.out.println("Exception thrown : " + e);
                  }
              }
          }
          

          【讨论】:

            【解决方案6】:

            默认情况下,ArrayList 设置为不少于 10。但是,基于它可以扩展的事实,它可能需要超过默认容量。为了安全起见,设置初始容量以避免再次声明 ArrayList 是合理的。因此,初始容量是原始数据类型 int。它旨在获取我们要添加的列表的数量。

            【讨论】:

            • 这个答案什么也没回答。它很难阅读,除此之外 - 包含错误信息。查看接受的答案进行比较。
            【解决方案7】:

            Arraylist 大小和容量不同。

            例如: 在下面的arraylist中,初始容量= 3,列表大小= 0,因为列表中还没有元素。

            ArrayList 列表 = 新的 ArrayList(3);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-12
              • 1970-01-01
              • 1970-01-01
              • 2012-12-12
              • 1970-01-01
              • 2012-04-08
              • 1970-01-01
              相关资源
              最近更新 更多