【问题标题】:why arrays are initialized to default values but not arraylist in java?为什么数组被初始化为默认值而不是java中的arraylist?
【发布时间】:2014-02-22 01:49:30
【问题描述】:

ArrayList 的实现在底层使用了Array。然而,Arrays 被初始化为默认值(0 or null)ArrayList 只是空的。这是为什么呢?

       int[] arr = new int[10];
       String[] arr1 = new String[11];
       System.out.println(Arrays.toString(arr));
       System.out.println(Arrays.toString(arr1));
      List<Integer> list = new ArrayList<Integer>(10);
      System.out.println(list);

      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
      [null, null, null, null, null, null, null, null, null, null, null]
      []

这意味着每次我使用ArrayList时,我都需要填写内容; 我在我的代码中尝试了以下部分,它正在抛出NoSuchElementException,然后我意识到它不是默认的,而Arrays do

if (list.get(i)==null){
         list.add(i,x);
  else:
        list.add(i,list.get(i)+x)

编辑:

even List<Integer> list = new ArrayList<Integer>(10);
prints [] although I initialized the size;

【问题讨论】:

  • 关于您的编辑:您没有将大小设置为 10。您将容量设置为 10。在您向其中添加元素之前,大小为 0。
  • 这意味着每次我使用 ArrayList 时,我都需要填写内容 ...是的,如果您不“填写内容”,您就没有使用它.
  • 打印列表时看不到任何元素,因为它的toString() 方法使用size 来确定打印的元素数量,而不是数组的容量。当您创建具有初始容量10ArrayList 时,它的大小仍然是0,因为您还没有向它添加任何元素,即使存储您的对象的数组被初始化为 new Object[10] 这意味着它是填充 10 个空值。
  • @user1988876无论如何,您初始化ArrayList 的“容量”只是一个提示。如果您将容量指定为 10,您仍然可以向其添加 11 个元素。无论您指定什么容量,您的程序的结果都应该是相同的;只有性能受到影响。

标签: java arrays list arraylist


【解决方案1】:

构造数组时,数字是数组的实际大小(以后不能更改)。 ArrayList 构造函数中的数字是初始 容量(为元素保留的空间),但 size 为零。 ArrayList 的大小在构造后可以改变。

【讨论】:

  • 但它仍然可以将其值默认为零或空。 arraylist 的动态特性将如何影响它包含的内容
  • @user1988876 您正在调用arrayList 的toString() 方法。由于它的大小为 0,所以 toString 构建的 String 是空的(查看源代码)。这就是为什么你什么也没“看到”。
  • @GregHewgill 这是否意味着即使您将容量初始化为 10,您仍然可以添加 20 个元素? (对于数组列表)
  • @Xbit 是的。 10 只是初始容量。之后可以增加。
  • @Xbit 指定初始容量根本不会影响其行为,只会影响其性能
【解决方案2】:

创建数组时,您指定大小。这是必需的,因为数组的大小在创建后无法更改。那么,数组的每个元素中都必须包含一些内容,最明显的内容是 0null

另一方面,ArrayLists 被设计为可以调整大小。因此,您不必在创建它们时指定大小。如果起始大小大于零,则必须初始化所有这些元素,而且更容易不这样做。所以起始大小为零。

【讨论】:

  • 你初始化的是容量,不是大小。数组列表为 10 个元素腾出空间,但这并不意味着它有 10 个元素。
【解决方案3】:

ArrayList 集合的目的是几乎与数组一样快,而不会浪费(= 预分配)空间。因此,它被初始化为size 0(即空),而不是具有多个null 值(尽管实际上底层数组是按照指定的容量构造的)。

话虽如此,请注意ArrayList 将存储对象而不是基元(例如,String 对象而不是charint 基元)。

【讨论】:

    【解决方案4】:

    我猜你在找Collections.nCopies:

    List<Integer> list = new ArrayList<Integer>(Collections.nCopies(10, 0));
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      List<Integer> items = Arrays.asList(new Integer[10]);
      

      你会得到一个包含 10 个空元素的列表。

      同样,

      Integer[] numbers = new Integer[10];
      Arrays.fill(numbers,0);
      List<Integer> list = Arrays.asList(numbers);
      

      你会得到一个包含 10 个初始化为 0 的元素的列表;

      【讨论】:

        【解决方案6】:

        由于 ArrayList 最初不包含任何元素,因此不能将这些元素的值默认为 null 或任何其他值。

        【讨论】:

          【解决方案7】:

          这是因为ArrayList 中没有可以创建特定大小的实例的构造函数。 Collections.nCopies(int n, T o) 允许创建具有预定义大小的列表并使用任何值对其进行初始化。顺便说一句,它在内部使用 CopiesList 具有 CopiesList(int n, E e) 构造函数的类

          【讨论】:

            【解决方案8】:

            null0 的原因是原始类型和Object 类型之间的差异。它们的默认值为null0(仅false 为布尔值)。 见The Java Tutorial

            ArrayList 在创建后物理上不是空的。它有初始容量,但它显示了他的大小0,即使你完全初始化了它。因为集合size()具有逻辑意义,而不是物理意义。

            List<Integer> list = new ArrayList<Integer>(10);
            

            您还可以使用以下静态方法填充新的集合(列表)

            Collections.fill(list, 0) // int 0 is auto-boxed to `Integers` 0 
            

            【讨论】:

            • 注意:fill() 在初始化后不能直接工作,因为列表大小 = 0。有关这种情况,请参阅 nCopies() 答案。
            猜你喜欢
            • 2011-03-26
            • 1970-01-01
            • 1970-01-01
            • 2010-10-18
            • 1970-01-01
            • 2022-11-17
            • 2019-01-31
            • 2017-12-09
            相关资源
            最近更新 更多