Set接口
java.util.Set接口 extends Collection接口
Set接口的特點:
- 不允許存儲重復的元素
- 沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷
java.util.HashSet集合 implements Set接口
HashSet特點:
- 不允許存儲重復的元素
- 沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷
- 是一個無序的集合,存儲元素和取出元素的順序有可能不一致
- 底層是一個哈希表結構(查詢的速度非常快)
Set<Integer> set = new HashSet<>();
//使用add方法往集合中添加元素
set.add(1); set.add(3); set.add(2); set.add(1); //使用迭代器遍歷Set集合 Iterator<Integer> it = set.iterator(); while(it.hasNext(){ Iterator n = it.next(); System.out.println(n);//1,2,3 無序且不重復 }
HashSet集合存儲數據的結構(哈希表)
哈希值:是一個十進制的整數,由系統隨機給出(就是對象的地址值,是一個邏輯地址,是模擬出來得到的地址,不是數據實際存儲的物理地址)
在Object類有一個方法,可以獲取對象的哈希值
int hashCode() 返回該對象的哈希碼值。
HashCode方法的源碼:
public native int hashCode();
native:代表該方法調用的是本地操作系的的方法
哈希表
哈希表:hashSet集合存儲數據的結構
jdk1.8版本之前:哈希表 = 數組+鏈表
jdk1.8版本之后:
- 哈希表 = 數組+鏈表;
- 哈希表 = 數組+紅黑樹(提高查詢的速度)
哈希表的特點:速度快
存儲數據到集合中,先計算元素的哈希值
- abc:96354 在數組的存儲位置
- 重地——通話:1179395 兩元素不同,但是哈希值相同 哈希沖突
數組結構:把元素進行了分組(相同哈希值的元素是一組)
鏈表/紅黑樹結構:把相同哈希值的元素連到一起(如何鏈表的長度超過了8位,那么就會把鏈轉換位紅黑樹(提高查詢的速度))
Set集合存儲元素不重復的原理
Set集合存儲元素不重復的元素的前提:
前提:存儲的元素必須重寫hashCode方法和equals方法
//創建HashSet集合對象
HashSet<String> set = new HashSet<>();//哈希表:數組+鏈表/紅黑樹
String s1 = new String("abc");
String s2 = new String("abc"); set.add(s1); set.add(s2); set.add("重地"); set.add("通話"); set.add("abc"); System.out.println(set);/[重地,通話,abc]
原因:
Set集合在調用add方法的時候,add方法會調用元素hashCode方法和equals方法,判斷元素是否重復
HashSet存儲自定義類型元素
Set集合報錯元素原因:
存儲的元素(String,Integer,...Student,Person...),必須重寫hashCode方法和equals方法
LinkedHashSet集合
java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特點:
底層是一個哈希表(數組+鏈表/紅黑樹+鏈表:多了一條鏈(記錄元素的存儲順序),保存元素有序
HashSet<String> set = new HashSet<>();//[]無序,不允許重復 LinkedHashSet<String> set = new LinkedHashSet<>();[]//有序,不允許重復
可變參數
可變參數:是JDK1.5 之后出現的新特性
使用前提:
- 當方法的參數列表數據類型已經確定,但是參數的個數不確定,就可以使用可變參數。
使用格式:定義方法時使用
- 修飾符 返回值類型 方法名(數據類型...變量名){}
可變參數的原理:
- 可變參數底層就是一個數組,根據傳遞參數個數不同,會創建不同長度的數組,來存儲這些參數
- 傳遞的參數個數,可以是0個 (不傳遞),1,2...多個
可變參數的注意事項:
- 一個方法的參數列表,只能有一個可變參數
- 如果方法的參數有多個,那么可變參數必須寫在參數列表的末尾
public static void method(String b, double c ,int d ,int...a){}
//可變參數的特殊(終極)寫法
public static void method(Object...obj){} Collections集合工具類的方法 java.util.Collections是集合工具類,用來對集合進行操作。部分方法如下: public static <T> void sort(List<T> List ,Comparator<? super T>):將集合中元素按照指定規則排序。 Comparator和Comparable的區別 Comparable:自己(this)和別人(參數)比較,自己需要實現Comparable接口,重寫比較的規則compareTo方法 Comparator:相當於找一個第三方的裁判,比較兩 Comparator的排序規則: o1-o2:升序