Java集合(一)
集合概述
Java集合類存放於 java.util 包中,是一個用來存放物件的容器。
①、集合只能存放物件。比如你存一個 int 型資料 1放入集合中,其實它是自動轉換成 Integer 類後存入的,Java中每一種基本型別都有對應的引用型別。
②、集合存放的是多個物件的引用,物件本身還是放在堆記憶體中。
③、集合可以存放不同型別,不限數量的資料型別。
Java 集合可分為 Set、List 和 Map 三種大體系
Set:無序、不可重複的集合
List:有序,可重複的集合
Map:具有對映關係的集合
在 JDK5 之後,增加了泛型,Java 集合可以記住容器中物件的資料型別>
1、HashSet
HashSet 是 Set 介面的典型實現,大多數時候使用 Set 集合時都使用這個實現類。我們大多數時候說的set集合指的都是HashSet
HashSet 按 Hash 演算法來儲存集合中的元素,因此具有很好的存取和查詢效能。
HashSet 具有以下特點:
-
不能保證元素的排列順序
-
不可重複
-
HashSet 不是執行緒安全的
-
集合元素可以使 null
當向 HashSet 集合中存入一個元素時,HashSet 會呼叫該物件的 hashCode() 方法來得到該物件的 hashCode 值,然後根據 hashCode 值決定該物件在 HashSet 中的儲存位置。
所以元素存在於set集合的哪個位置,由這個值的hashcode決定。
如果兩個元素的 equals() 方法返回 true,但它們的 hashCode() 返回值不相等,hashSet 將會把它們儲存在不同的位置,但依然可以新增成功。
不可重複,真正指的是hashcode不相同,流程如下
- 檢測重複不重複,第一步用equals判斷內容是否重複,如果內容不重複(false),那就直接進行儲存。
- 如果內容重複,equals返回值為true,再用hash檢測儲存的地址。
java中,對set做了優化,可以存放不同型別的值,甚至可以直接存放類,很多都提現了java的方便性。
Set的一些方法:
程式碼實現:
Set set = new HashSet(); //Set介面引用指向子類Hashset的物件 //set物件代表的是一個集合{} set.add(1); //新增元素 set.add("a"); System.out.println(set); set.remove(1); System.out.println(set); //移除元素 System.out.println(set.contains("1")); //判斷是否包含元素 set.clear(); //清空集合 System.out.println(set);
執行結果:
使用 Iterator 介面遍歷集合元素
Iterator 介面主要用於遍歷 Collection 集合中的元素,Iterator 物件也被稱為迭代器
Iterator 介面隱藏了各種 Collection 實現類的底層細節,嚮應用程式提供了遍歷 Collection 集合元素的統一程式設計介面
Iterator 僅用於遍歷集合,Iterator 本身並不提供承裝物件的能力。如果需要建立 Iterator 物件,則必須有一個被迭代的集合。
Iterator介面的一些方法:
程式碼實現:
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
//使用迭代器遍歷集合
Iterator it=set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
//for each迭代集合
for (Object obj :set ) {
//這個的意思是把set的每一個值取出來,賦值給obj
//直到迴圈set的所有值
System.out.println(obj);
}
System.out.println(set.size());
//獲取集合元素的個數
執行結果:
Hashset集合特性
不可重複性簡單證明
程式碼實現:
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add("d");
System.out.println(set);
System.out.println(set.size());
執行結果:
說明set集合存的值是不重複的,存入的第五個元素並沒有接收,因為與第四個元素相同。
Hashset排列順序
程式碼實現:
set.add("a");
set.add("b");
set.add("c");
set.add("d");
set.add(null);
System.out.println(set);
System.out.println(set.size());
執行結果:
這裡我們在最後輸入的null卻在最前列印,說明了元素排列順序和新增的先後順序無關,應當是與hashcode有關。
hashCode() 方法
HashSet 集合判斷兩個元素相等的標準:兩個物件通過 equals() 方法比較相等,並且兩個物件的 hashCode() 方法返回值也相等。
如果兩個物件通過 equals() 方法返回 true,這兩個物件的 hashCode 值也應該相同。