一、Set集合 1.HashSet底層實際上是一個HashMap,HashMap底層採用了哈希表數據結構。 2.哈希表又稱為散列表,哈希表底層是一個數組,這個數組中每一個元素是一個單向鏈表,每個單向鏈表都有一個獨一無二的hash值,代表數組的下標。在某個單向鏈表中的每一個節點上的hash值是相等的, ...
一、Set集合
1.HashSet底層實際上是一個HashMap,HashMap底層採用了哈希表數據結構。
2.哈希表又稱為散列表,哈希表底層是一個數組,這個數組中每一個元素是一個單向鏈表,每個單向鏈表都有一個獨一無二的hash值,代表數組的下標。在某個單向鏈表中的每一個節點上的hash值是相等的,hash值實際上是key調用hashCode方法,再通過"hash function"轉化成的值。
3.如何向哈希表中添加元素
先調用被存儲的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()); } } }
二、重寫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方法
三、源碼:
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.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料