Java學習:Set接口與HashSet集合存儲數據的結構(哈希表)


Set接口

java.util.Set接口 extends Collection接口

Set接口的特點:

  1. 不允許存儲重復的元素
  2. 沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷
java.util.HashSet集合 implements Set接口

HashSet特點:

  1. 不允許存儲重復的元素
  2. 沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷
  3. 是一個無序的集合,存儲元素和取出元素的順序有可能不一致
  4. 底層是一個哈希表結構(查詢的速度非常快)
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...多個

可變參數的注意事項:

  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:升序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM