1.何為集合?:
java中為了方便儲存物件。就產生了集合。
所以集合只用於儲存物件。集合的長度是可以變化的。也可以去儲存不同的對象。這裡要注意的是:
List<Integer> list = new ArrayList<Integer>();list.add(3);
這裡其實是java中自動進行了裝箱操作。將int類型的3裝箱成Integer類型的。在取出來的時候又自動拆箱。
2.集合分類:
在java中一類集合直接儲存物件,則是去實現Collection.
另一類集合根據映射關係實現Map介面,具有索引值對關係。兩類介面共同組成了JAVA中的集合。
3.Collection
Collection能讓你去操作對象組,它是位於類集層次的最頂層。它根據是否允許元素的重複,分了兩大類。Set集合和List集合。
List 主要去處理序列(對象的列表),其中允許對象的重複。如ArrayList,LinkedList和 Vector是三個主要實作類別。
Set 主要去處理集合,集合必須包含唯一元素。
其中還有一個比較重要,SortedSet 擴充了Set 集合去處理排序集合。
4.Map集合:
Map是一個儲存關鍵字和值的關聯或者說是索引值對的對象。可以去通過一個關鍵字來得到它的值。關鍵字的值都是對象。
但是要注意的是:關鍵字(key)必須唯一,不能重複,但是值(value)可以重複。但是在HashTableHashMap中的值可以為null.而在HashMap則是不可以的。
5.集合的安全執行緒問題:
Vector和HashTable是線程同步(synchronized)。ArrayList 和 HashMap則是線程不同步的。
這樣就導致了前者的安全性好,而效率不高。後者的效率高但是安全性不好。這樣就要線程不要求安全的時候用後者,否則用前者。
6.equal()和hashCode()
關於hashCode只有hashSet,hashMap等才會用到。對於ArrayList等不會用到。
對於hashSet之類的集合,每個對象要放入到集合中,在這之前,會去先根據自身的屬性,計算出一個hashCode值.當然這個hashCode方法是可以去選擇重載的。
然後再去找到在記憶體中hashCode值相同的地區,調用equal()方法比較有沒有相同的對象,如果沒有就存入集合中,如果存在對象,就不存入集合。
這裡要注意的就是只有當存在hashCode值相同的時候才會去調用equals 方法。否則是不調用的。
還有一點在注意:
當一個對象被存入hashSet中後,就不能修改這個對象的那些個參與電腦雜湊值的欄位了。否則,對象修改後的雜湊值與最初儲存進hashSet集合中的hashCode值不同了。
在這樣的情況下,技術在contains方法使用該對象的當前引用作為的參數去HashSet集合中檢索對象,也找不到返回對象的結果。這就會導致會無法去HashSet集合中單獨刪除對象,從而造成記憶體泄露。