1. 程式人生 > >java基礎-arrayList

java基礎-arrayList

重新 cio 全面 over 都是 param list() 源碼 lose

ArrayList: 結構之錢了解了,ArrayList()會構造出一個初始容量=10的空的列表; ArrayList()的增加和刪除都是拷貝數組到新的數組(如果當前數組容量不足的話),把數組內的元素全部前移/後移去完成,然後把引用指向新的數組; LinkedList()是直接刪除引用節點,並且重新改變前後節點的引用到前後元素; ArrayList()可以通過下標迅速找到對應的元素; 線程同步,同樣ArrayList不是線程安全的list,和LinkedList一樣; ArrayList()擴容是按照當前容量的1.5倍擴容的(源碼內寫死的): /** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } 右移,>>為右移運算符,num >> 1,相當於num除以2 int newCapacity = oldCapacity + (oldCapacity >> 1); 這裏相當於1.5倍; hashCode()和equals(): 到現在只用過equals,沒用過hashCode; hashCode() 和 equal() 和 ==,在Java裏用來對比兩個對象是否相等一致; ==是對比引用地址(變量是否相等); equal是對比值(對比對象是否相等,默認等同於==,的也是對比對象的地址,但是對比對象內容的時候不等同==); hashCode是對比哈希值(返回哈希值,如果兩個對象相等,那麽它們的哈希值一定是相同的); 如果兩個對象根據eqaul()方法比較不相等,那麽產生的哈希值不一定相等(碰撞的情況下還是會相等的); 但是有一點: 重寫的equal()裏一般比較的比較全面比較復雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高,那麽hashCode()既然效率這麽高為什麽還要equal()呢? 因為hashCode()並不是完全可靠,有時候不同的對象他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,並不是絕對可靠; 1.equal()相等的兩個對象他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。 2.hashCode()相等的兩個對象他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。

java基礎-arrayList