今天在实现线性表的顺序存储结构时发现,有一个地方List的长度的返回值是使用array.length实现。以下代码为java中ArrayList的源码:
private transient Object[] elementData;//定义了ArrayList中用于保存对象的数组
private int size;
//顺便初始化了size,该size为c.toArray()后数组的长度
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
//返回ArrayList的长度
public int size() {
return size;
}
对上述代码有疑问,array.length返回的值是表示此数组对象可以存储多少元素*(think in java在关于数组16.2章中给出的)。如果arrayList容量为100,然而其中的元素只有50,那么调用ArrayList的size()方法返回的值是50还是100?
测试数组length属性方法如下:
import java.util.*;
public class TestArrayLength
{
public static void main(String[] args)
{
int[] test_01 = {1,2,3,4,5,6,7,8,9,10};
Integer[] test_02 = new Integer[10];
ArrayList<Integer> list = new ArrayList<Integer>(100);
test_02[0] = 1;
test_02[1] = 2;
for(int i = 0;i < 50;i++)
{
list.add(i);
}
System.out.println(test_01.length);
System.out.println(test_02.length);
System.out.println(list.size());
}
}
输出为10,10,50.
用了同样的array.length为啥返回的值不一样。
原因是:实质上在创建一个ArrayList时,其容量一般为默认的10或者自己指定大小,但是其size变量任然为0,没有对其进行赋值。
ArrayList每次在调用add()方法和remove()方法是,都对size进行了自加或者自减操作,所以size()方法可以返回list中元素的个数,size变量类似于计数器。
总结:array.length返回的是数组当前的容量,并不会返回数组中元素的个数。(元素刚好填充满数组的情况除外。)