【问题标题】:What is the Default ArrayList size in Java 8 [duplicate]Java 8中的默认ArrayList大小是多少[重复]
【发布时间】:2017-06-08 18:24:44
【问题描述】:
  1. java 8 中数组列表的默认大小是多少?据我记得并在谷歌上搜索过,在任何地方我都发现它默认为 10,但是当我输出以下代码时,它正在打印 0。java 8 中是否发生了与此相关的任何更改?

    ArrayList<String> arrList = new ArrayList<String>();
    System.out.println("size:"+arrList.size());
    
  2. 我的第二个查询是:当我向列表中添加一些元素时,大小会增加之前大小的 1.5 倍还是仅增加 1?

PS:有没有办法知道arraylist对象的当前容量?

【问题讨论】:

标签: java arraylist java-8 resize size


【解决方案1】:

初始 Listcapacity 为零(除非您另有说明):

 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

当它必须增长时,使用它:

int newCapacity = oldCapacity + (oldCapacity >> 1)

oldCapacity &gt;&gt; 1 被二除,所以增长了 1.5

要注意的一件事是,一旦删除元素,容量就不会改变。如果您需要缩小使用trimToSize

10 实际上是正确的,但当你将一个元素放入ArrayList 时:

    ArrayList<String> ar = new ArrayList<>();

    Field f = ar.getClass().getDeclaredField("elementData");
    f.setAccessible(true);
    int l = ((Object[]) f.get(ar)).length;
    System.out.println(l); // 0

    ar.add("1");

    int x = ((Object[]) f.get(ar)).length;
    System.out.println(x); // 10

【讨论】:

  • 根据Javadoc,初始容量是10...
  • @OliverCharlesworth 确实...但是此代码 Field f =arrayList.getClass().getDeclaredField("elementData");f.setAccessible(true);int l = ((Object[]) f.get(arrayList)).length;System.out.println(l); 将输出零...
  • @OliverCharlesworth 这很聪明 :) 10 被推迟,直到你真正在ArrayList 中放入一些东西。 thx,我应该阅读该文档。
  • 是的,似乎是一个懒惰的实现;)
【解决方案2】:

我认为您将大小与容量混淆了。大小是您放入arrayList 的元素数量,而容量是arrayList 可以容纳的最大元素数量。一旦达到最大值,容量就会翻倍(如果我没记错的话)。

因此,当您在arrayList 中添加元素时,大小总是会增加一。如果大小等于容量,那么容量就会增加。

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2013-02-25
    相关资源
    最近更新 更多