package asdfg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class aaa {
public static void main(String[] args) {/*** 小提示:* 1.對于所有沒有索引的方法,我們都不能使用for循環進行遍歷* 2.提到接口,我們就應該想到他下面有多少個實現類,并且實現類的方法是怎樣使用的* 3.哈希表結構的速度是非常快的* 4.哈希表的順序是無序的* 5.可以通過重寫的方法使哈希值的值相等* * * Set接口簡介:* 1.Java.util.set接口和Java.util.list接口同樣繼承來自collection接口,與collection接口中的方法基本上是一樣的,* 并沒有對collectIon接口進行功能上的擴充,只是比collectIon接口在形式上更加嚴格,與lIst接口不同的是,Set接口中的元素* 是無序的,并且都會以某種規則保證存入的元素不出現重復* 2.Set接口的兩個集合:Hashset集合和HashmAP集合* * 小問題:* 1.Hashset是根據什么來確定元素在集合中的存儲位置的?具有什么功能?* 解釋:是根據對象的哈希值來確定元素在結合中的存儲位置,具有良好的存儲和查找性能,* 2.Hashset是如何保證元素在集合當中的唯一性的?* 解釋:保障元素唯一性的方式依賴于Hashcode方法與EQuals方法*//** Set接口的特點:* 1.不允許存儲重復元素* 2.沒有索引,沒有帶索引的方法也不能使用普通for循環進行遍歷;* * java.util.HashSet集合 implements(實現)set接口;* HshSet方法的特點:* 1.不允許存儲重復元素* 2.沒有索引,沒有帶索引的方法也不能使用普通for循環進行遍歷* 3.是一個無序的集合,存儲元素和起初元素的分析有可能不一致* 4.底層是一個哈希表結構,(查詢的速度是相當迅速的)* *///創建一個HashSet集合Set<Integer> set= new HashSet<>();//添加元素使用add方法set.add(1);set.add(3);set.add(2);set.add(1); //1.使用迭代器進行遍歷set集合Iterator<Integer> it=set.iterator();//判斷是否有下一個while(it.hasNext()){//如果有的話,將下一個的值進行返回然后進行輸出Integer n=it.next();System.out.println(n);}//2.使用增強for遍歷for集合System.out.println("+++++++++++++++++++++");for(Integer i :set){System.out.println(i);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/*** HashSet集合存儲數據的結構使用的是哈希表,下面我們進行了解哈希值是怎么一回事* 哈希值:是一個十進制的整數 由系統隨機給值,是一個模擬地址,不是真實存在的,也就是邏輯上的地址值,注意:是邏輯地址值,而不是物理地址* * 如何獲取對象的哈希值?* 使用Object類當中的方法來獲取對象的哈希值* 該方法位于java.long.Object類中的hashcode()方法 其作用是返回該對象的哈希值碼* * *//*** hashcode方法的源碼:* public native int hashCode();* native代表該方法調用的是本地操作系統的方法* * *///因為person extends Object,所以可以使用其中的hashCode方法person p1=new person();int h1=p1.hashCode();//對象的哈希值System.out.println(h1);//31168322System.out.println(p1);//asdfg.person@1db9742就是上面邏輯地址當中的十六進制的表示//在創建另外的一個對象person p2=new person();int h2=p2.hashCode();//對象的哈希值System.out.println(h2);//17225372System.out.println(p2);//asdfg.person@106d69c就是上面邏輯地址當中的十六進制的表示//String 的哈希值String s1=new String("abc");String s2=new String("abc");System.out.println(s1.hashCode());//96354System.out.println(s2.hashCode());//96354//字符串重寫之后的哈希值是相同的//哈希值的改變是可以通過方法的程序進行的,如果哈希值不被重寫,就是由系統隨機給出的,/*** 什么是哈希表?* 在JDK1.8之前,哈希表底層采用數組+鏈表結構,及使用鏈表處理沖突,這里的沖突是指當一個哈希值對應多個數據的時候,不行,* 但是它位于一個桶中的元素較多及hash值相等的元素較多時,通過key查找效率較低,而JDK1.8中,哈希值存儲結構采用數據+鏈表+紅黑樹實現,* 超過8(閥值)將鏈表轉換為紅黑樹,這樣大大減少了查找時間,簡單來說,鏈表是由數組+鏈表+紅黑樹實現的,* * 哈希表的結構特點:* 查詢速度快* * 哈希表結構當中數組的個數一開始是16個塊,從0開始,初始容量是16個* * 數組結構:將相同哈希值的元素分為一組* 鏈表/紅黑樹:將哈希值相同的元素放到一起或者說是連接到一起* */
}
}