如果我具有以下条件:
List<String> list = new ArrayList<>(Arrays.asList("a","b","c"));
并致电:
System.out.println(list.size());
它将按预期打印3。
size()
方法的代码仅为return size;
,其中size
是private int
。
所以我想知道它实际上是在哪里设置size
变量的。
我看到它正在调用构造函数public ArrayList(Collection<? extends E> c)
,这很好,但是当我在其中调试并悬停在c
上时,它已经说了size = 3
。
在Collection<? extends E> c
中是否有东西将其设置为3,在之前到达了ArrayList
构造函数?
答案 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 }})并计算其大小。
(...)是
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