List

201 阅读1分钟

ArrayList

  • 构造方法
 // 有参构造
    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);
        }
    }
   /**
     * Constructs an empty list with an initial capacity of ten.
     * 构造一个初始容量为10的空列表
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

测试

    @Test
    public void arrayListTest() {
        //无参构造
        List<Integer> list = new ArrayList<>();
        //初始容量为0
        System.out.println(getArrayListCapacity(list));//0
        //添加一个元素后初始容量变为10
        list.add(1);
        System.out.println(getArrayListCapacity(list));//10
        
        //有参构造初始为0
        List<Integer> list1 = new ArrayList<>(0);
        //初始容量为0
        System.out.println(getArrayListCapacity(list1));//0
        //添加一个元素后初始容量变为1
        list1.add(1);
        System.out.println(getArrayListCapacity(list1));//1
    }
    
    public int getArrayListCapacity(List<Integer> arrayList) {
        Class<ArrayList> arrayListClass = ArrayList.class;
        try {
            Field field = arrayListClass.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] objects = (Object[]) field.get(arrayList);
            return objects.length;
        } catch (NoSuchFieldException e) {
            return -1;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return -1;
        }
    }
  • 小结 ArrayList可以自动扩容,不传初始容量或者初始容量是0,都会初始化一个空数组,但是如果添加元素,会自动进行扩容,所以,创建ArrayList的时候,给初始容量是必要的

扩容是原有容量大小的1.5倍进行向下取整。

扩容时是新建一个list,然后将原有的数据复制过去。