新ArrayList

时间:2018-10-19 13:29:37

标签: java arraylist

如果我具有以下条件:

List<String> list = new ArrayList<>(Arrays.asList("a","b","c"));

并致电:

System.out.println(list.size());

它将按预期打印3。

size()方法的代码仅为return size;,其中sizeprivate int

所以我想知道它实际上是在哪里设置size变量的。

我看到它正在调用构造函数public ArrayList(Collection<? extends E> c),这很好,但是当我在其中调试并悬停在c上时,它已经说了size = 3

Collection<? extends E> c中是否有东西将其设置为3,在之前到达了ArrayList构造函数?

4 个答案:

答案 0 :(得分:3)

  

(...)我想知道它实际上是在哪里设置size变量

您致电了ArrayList中的this constructor,在其中source code我们可以看到 size = elementData.length;

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length; // <-- HERE
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}

因此,一旦它被称为size()source code),就已经设置了该值。


  

当我调试到那里并悬停在c上时,它已经说过size = 3

如果您指的是下面的图片,...我认为这可能是一些IDE功能(例如我的IntelliJ IDEA),它可以推断出c({{1 }})并计算其大小。

enter image description here


  

(...)List中将其设置为3的东西,然后才到达Collection<? extends E> c t构造函数吗?

记住ArrayLis返回一个List,它由Arrays.asList的构造方法作为Collection使用,它也有一个size方法。 IDE可以将其用于计算ArrayList的值。


PS:源代码可能从特定的jdk版本到另一个版本略有不同。

答案 1 :(得分:1)

它说已经是3了,因为这就是您作为Arrays.asList("a","b","c")的参数传递的new ArrayList<>(Arrays.asList("a","b","c"));的大小。

来源:

public ArrayList(Collection<? extends E> c) {
    // c is already instantiated here 
    elementData = c.toArray();
    // ...
}

答案 2 :(得分:1)

初始化新的ArrayList时会发生这种情况;在构造函数中,您可以看到列表的大小设置为您传入的数组的大小:

/**
 * Constructs a list containing the elements of the specified
 * collection, in the order they are returned by the collection's
 * iterator.
 *
 * @param c the collection whose elements are to be placed into this list
 * @throws NullPointerException if the specified collection is null
 */
public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // replace with empty array.
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

因此,特别是if ((size = elementData.length) != 0)将大小(您正在谈论的私有字段)设置为传递给构造函数的数组的长度。

答案 3 :(得分:0)

这里,大小是在ArrayList的构造函数的下一行设置的。

expression
    = terms ( _ delimiter _ terms )*

terms "terms"
    = term ( _ term )*

term "term"
    = [a-z]+

delimiter "delimiter"
    = "."

_ "whitespace"
  = [ \t\n\r]+

在另一个SO线程中详细解释了细节 Details