创建一个ArrayList对象,传入整型参数

 

@Test
    public void arrayListConstructor(){
        ArrayList<Object> objects = new ArrayList<>(5);
        System.out.println(objects.size());
     // 0 }

 

结果调用size方法,返回结果却是0。

难道是真的没生效吗?

ArrayList对象的size()方法源码:

/**
     * Returns the number of elements in this list.
     *
     * @return the number of elements in this list
     */
    public int size() {
        return size;
    }

直接返回的是size属性,继续看size属性的定义:

/**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;

是一个整型的变量。

 

再看ArrayList构造方法的源码:

 

/**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

 

这个构造方法并没有对"size"属性做任何操作,虽然不代表其他地方(代理、监听等)对size进行了处理,但是ArrayList目前没有这些东西;

因为"size"属性在构造方法里未被赋值操作,所以当调用"size()"方法时直接返回的"size"属性,实际上是int变量默认值0

 

只是指定上面构造方法指定的int型参数是容纳能力capacity,并非size的大小,list初始化还是没有一个元素,即size=0

 

那么如何初始化ArrayList容量呢

@Test
    public void appointCapacity(){
        List<Object> src = new ArrayList<>();
        src.add(123);
        src.add("Luo");
        src.add(23.5);
        // 下面一行只是指定lists的容纳能力capacity,并非size的大小,list初始化还是没有一个元素,即size=0
        // List<Object> dest = new ArrayList<>(src.size()));

        List<Object> dest = new ArrayList<>(Arrays.asList(new Object[src.size()]));
        System.out.println(dest.size());
        // 3

        // 注意,源src是第二个参数,而拷贝到链表dest是第一个参数
        Collections.copy(dest, src);


        dest.forEach(System.out::println);
    }

上面是对一个数组进行拷贝,指定初始化数组的"size":List<Object> dest = new ArrayList<>(Arrays.asList(new Object[${size}]));