1、Set集合java
1.HashSet底層其實是一個HashMap,HashMap底層採用了哈希表數據結構。node
2.哈希表又稱爲散列表,哈希表底層是一個數組,這個數組中每個元素是一個單向鏈表,每一個單向鏈表都有一個獨一無二的hash值,表明數組的下標。在某個單向鏈表中的每個節點上的hash值是相等的,hash值其實是key調用hashCode方法,再經過"hash function"轉化成的值。git
3.如何向哈希表中添加元素github
先調用被存儲的key的hashCode方法,通過某個算法得出的hash值,若是在這個哈希表中不存在這個hash值,則直接加入元素。若是該hash值已經存在,繼續調用key之間的equals方法,若是equals方法返回false,則將該元素添加。若是equals方法返回true,則放棄添加該元素。算法
4.HashSet實際上是HashMap中的key部分,HashSet有什麼特色,HashMap中的key應該具備相同的特色。數組
5.HashMap和HashSet初始化容量都是16,默認加載因子0.75微信
package com.bjpowernode.java_learning; import java.util.HashSet; import java.util.Set; import java.util.Iterator; public class D88_2_ { public static void main(String[] args) { Set s = new HashSet(); s.add(1); s.add(1); s.add(100); Iterator i = s.iterator(); while(i.hasNext()) { System.out.println(i.next()); } } }
2、重寫hashCode和equals方法(有一個原則:散列均勻分佈)數據結構
package com.bjpowernode.java_learning; import java.util.*; public class D88_2_HasCodeAndEqualsMethod { public static void main(String[] args) { //建立集合 Set s = new HashSet(); Employee88 e1 = new Employee88("1000","Jack"); Employee88 e2 = new Employee88("1001","Jack"); Employee88 e3 = new Employee88("1001","Scott"); Employee88 e4 = new Employee88("1000","Jack"); Employee88 e5 = new Employee88("3000","JIN"); Employee88 e6 = new Employee88("3001","Cook"); //添加元素 s.add(e1); s.add(e2); s.add(e3); s.add(e4); s.add(e5); s.add(e6); System.out.println(s.size()); } } //根據現實的業務邏輯能夠得知,該公司的員工編號是:1000-9999 class Employee88{ //編號 String no; //姓名 String name; //Constructor Employee88(String no,String name){ this.no = no; this.name = name; } //咱們下面重寫了hashCode方法的目的就是: //可以對同工號同名字的員工判斷爲同一個元素 //若是不重寫hashCode方法,那麼會對對象的內存地址進行hashCode計算,這樣就不會有相同的元素了 //重寫hashCode方法以後,相同的hashCode值,就會接下來的判斷 //也就是重寫equals方法 //若是員工編號相同,而且名字相同,則是同一個對象 public boolean equals(Object o) { if(this==o) { return true; } if(o instanceof Employee88) { Employee88 e = (Employee88)o; if(e.no.equals(this.no) && e.name.equals(this.name)) { return true; } } return false; } //重寫hashCode方法 public int hashCode() { //以員工編號分組 return no.hashCode(); } }
解釋:六個對象裏面有一個徹底相同,所以會輸出五個元素;若是不重寫的話,就會輸出六個元素。學習
總結:存儲在HashSet集合或者HashMap集合key部分的元素,須要同時重寫hashCode和equals方法大數據
3、源碼:
D88_1_HashSetExample.java
D88_2_HasCodeAndEqualsMethod.java
https://github.com/ruigege66/Java/blob/master/D88_1_HashSetExample.java
https://github.com/ruigege66/Java/blob/master/D88_2_HasCodeAndEqualsMethod.java
2.CSDN:https://blog.csdn.net/weixin_44630050
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關注微信公衆號:傅里葉變換,我的公衆號,僅用於學習交流,後臺回覆」禮包「,獲取大數據學習資料