生活随笔
收集整理的這篇文章主要介紹了
【转】HashSet的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文網址:http://blog.csdn.net/aidesudi/article/details/4720201
Java代碼
public?class?TestHashSet?{ ????????public?static?void?main(String?[]?agrs){ ??????????Set?set?=?new?HashSet(); ??????????//添加一個string數據 ??????????set.add("文本"); ??????????//添加一個整數數據 ??????????set.add(new?Integer(5)); ??????????//添加一個付點數據 ??????????set.add(12.15); ??????????//輸出集合大小 ??????????System.out.println(set.size()); ??????????//在添加個相同的文本 ??????????set.add("文本"); ??????????//輸出大小 ??????????System.out.println(set.size()); ??????????//添加個null值 ??????????set.add(null); ??????????//輸出集合大小 ??????????System.out.println(set.size()); ??????????//再添加個null值 ??????????set.add(null); ??????????//輸出集合大小 ??????????System.out.println(set.size()); ??????????//判斷是否存在null值 ??????????System.out.println(set.contains(null)); ??????????//?刪除null值 ??????????set.remove(null); ??????????//判斷是否存在null值 ??????????System.out.println(set.contains(null)); ??????????//輸出集合大小 ??????????System.out.println(set.size()); ?????????? ??????????Set?set1?=?new?HashSet(); ??????????UserInfo?user?=?new?UserInfo("abc","123"); ??????????UserInfo?user1?=?new?UserInfo("abc","123"); ??????????set1.add(user); ??????????System.out.println(set1.size()); ??????????//判斷是否存在user1這個對象 ??????????System.out.println(set1.contains(user1)); ??????????user.setName("xyz"); ??????????user.setPassword("aaa"); ??????????//在更改了user值后user1還存在嗎? ??????????System.out.println(set1.contains(user1)); ?????????? ??????} ??} ????public?class?UserInfo?{ ??????private?String?name; ??????private?String?password; ??????private?int?HASHCODE=?Integer.MIN_VALUE; ?????? ??????public?UserInfo(String?name,String?password){ ??????????this.name?=?name; ??????????this.password?=?password; ??????} ??????public?String?getName()?{ ??????????return?name; ??????} ??????public?void?setName(String?name)?{ ??????????this.name?=?name; ??????} ??????public?String?getPassword()?{ ??????????return?password; ??????} ??????public?void?setPassword(String?password)?{ ??????????this.password?=?password; ??????} ?????? ??????public?int?hashCode()?{? ??????????if?(HASHCODE?==?Integer.MIN_VALUE)?{? ?????????????//?重新生成本類的hashCode? ????????????HASHCODE?=?name.hashCode()?+?password.hashCode();????? ??????????}? ??????????return?HASHCODE;? ????????}? ?????? ??????//判斷值是否相等 ??????public?boolean?equals(Object?obj)?{ ??????????if(obj?==?null?||?!(obj??instanceof??UserInfo)){ ??????????????return?false; ??????????} ??????????UserInfo?user?=?(UserInfo)obj; ??????????return?this.name?==?user.name?&&?this.password?==??user.password; ??????} ??} ??從上面的簡單添加,和輸出結果我想大家已經知道了set的一些用法和特性了。
1.??? HashSet允許null值。
2.???????HashSet中值不能重復。
3.???????Hashset在判斷是否存在同一個對象的時候首先會判斷對象的hashcode是否相等,然后在判斷對象的equals()是否相等。當你向HashSet中存入重復元素時,他會按照正常的流程執行存入操作
底層的數據結構采用的是數組+鏈表的存儲結構(明白這一點對于理解HashSet的原理非常重要),
也就是說數組中的每一個元素都是一個鏈表(對應java中的List的某一具體實現),
這樣當有元素要存入HashSet中時,便會首先通過hashCode()方法得到該對象的一個哈希碼,并利用該哈希碼通過一些轉換算法映射成數組的下標索引(當查找時也是如此,因此會非常的快),接下來便會判斷該下標處是否為null若為null則會創建一個列表,此時將待插入的對象直接插入,若列表已經存在則利用equals()方法將帶插入對象與列表中的元素逐個比較,相等則忽略,不存在相等元素則直接插入。
因此不同對象的hashCode()是可以相同的(最好是均勻的散列開,這樣才能充分的提高訪問及插入的速度),
根據equals()判定相等的對象所產生的hashCode()必須相等(根據其原理不難理解,否則的話便會有重復元素出現了)
保證一點??hashCode()與equals()必須能夠唯一的確定一個對象。
?
轉載于:https://www.cnblogs.com/wi100sh/p/4485508.html
總結
以上是生活随笔為你收集整理的【转】HashSet的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。