上圖,畫工差,大家隨便看看。
ArrayList
1.ArrayList是什么?有什么特點
(1)ArrayList是基於數組實現的,是一個動態數組,其容量能自動增長。
(2)ArrayList不是線程安全的, ArrayList實現了Serializable接口,因此它支持序列化。
(3)實現了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問。
(4)實現了Cloneable接口,能被克隆
2.ArrayList實現源碼
2.1構造方法
很明顯ArrayList就是一個數組哈。
//1----------------------- public ArrayList() { this(10); //調用ArrayList(10) 默認初始化一個大小為10的object數組。 } //2------------------------- public ArrayList(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //如果用戶初始化大小小於0拋異常,否則新建一個用戶初始值大小的object數組。 this.elementData = new Object[initialCapacity]; } //3-------------------------- public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // 當c.toArray返回的不是object類型的數組時,進行下面轉化。 if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }
2.2 看下add(E e)方法
//1----------------------- public boolean add(E e) { ensureCapacityInternal(size + 1); // 加入元素前檢查數組的容量是否足夠 elementData[size++] = e; return true; } //2----------------------- private void ensureCapacityInternal(int minCapacity) { modCount++; // 如果添加元素后大於當前數組的長度,則進行擴容 if (minCapacity - elementData.length > 0) grow(minCapacity); } //3----------------------- private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; //將數組的長度增加原來數組的一半。 int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; //如果擴充一半后仍然不夠,則 newCapacity = minCapacity;minCapacity實際元素的個數。 if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); //數組最大位2^32 // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }