一.問題
1.hashset,treeset是如何使用hashcode()和equal()方法的
2.treemap,treeset中的物件何時以及為何要實現comparable介面?
二.回答:
1.hashset是通過hashmap實現的,treeset是通過treemap實現的,只不過set用的只是map的key。
2.map的key和set都有乙個共同的特性就是集合的唯一性.treemap更是多了乙個有序性.
3.hashcode和equal()是hashmap用的,因為無需排序所以只需要關注定位和唯一性即可.
a.hashcode是用來計算hash值的,hash值是用來確定hash表索引的.
b.hash表中的乙個索引處存放的是一張鍊錶,所以還要通過equal方法迴圈比較鏈上的每乙個物件才可以真正定位到鍵值對應的entry.
c.put時,如果hash表中沒定位到,就在鍊錶前加乙個entry,如果定位到了,則更換entry中的value,並返回舊value
d.覆寫key的hashcode()和equal()時一定要注意,不要把它們和可變屬性關聯上,否則屬性變了之後hashcode會變,equal也會為false,這樣在map中就找不不到它了,而且這樣的物件因為找不到它所以得不到釋放,這樣就變成了乙個無效引用了(相當於記憶體洩漏).
4.由於treemap需要排序,所以需要乙個comparator為鍵值進行大小比較.當然也是用comparator定位的.
a.comparator可以在建立treemap時指定,這時排序時使用comparator.compare
b.如果建立時沒有指定comparator,那麼就會使用key.compareto()方法,這就要求key必須實現comparable介面.
c.treemap是使用tree資料結構實現的,所以使用compare介面就可以完成定位了.
import j**a.util.hashset;
import j**a.util.iterator;
public class wpsklhashset
//測試某個物件是否可以刪除
system.out.println(hashset.remove("a"));
system.out.println(hashset.remove("a"));
//經過測試,如果你想再次使用ir變數,必須重新更新以下
ir=hashset.iterat程式設計客棧or();
while(ir.hasnext())
}}/**
* 通過這個程式,還可以測試樹集的新增元素的無序性與輸出的有序性
*/import j**a.util.treeset;
import j**a.util.iterator;
public class treesettest
}}另在轉一些其他的區別(感謝「baidu知道」的andygulin朋友):
1、treeset是二差樹實現的,treeset中的資料是自動排好序的,不允許放入null值。
2、hashset是雜湊表實現的,hashset中的資料是無序的,可以放入null,但只能放入乙個null,兩者中的值都不能重複,就如資料庫中唯一約束。
3、hashset要求放入的物件必須實現hashcode()方法,放入的物件,是以hashcode碼作為標識的,而具有相同內容的string物件,hashcode是一樣,所以放入的內容不能重複。但是同乙個類的物件可以放入不同的例項。
總結
TreeSet和HashSet 去除重複資料的不同
treeset去重 首先treeset可以實現排序 org.junit.test public void testhashset if o1.getage o2.getage else public person string name,int age,int money 這是person類的構造器...
set中的hashSet和treeSet相關概念
簡而言之,帶hashcode的資料集,都犧牲空間帶有乙個hash對映表,能進行快速的匹配查詢。帶tree的資料集可以認為是一棵有序的樹形結構。那麼,hashcode結構不再具體詳細說明。下來詳細說下treeset中的排序問題,分成自然排序,和自定義排序 1.自然排序是讓set內部的元素自身實現com...
HashSet和TreeSet 的區別與分析
set是j a中乙個不包含重複元素的collection。更正式地說,set 不包含滿足e1.equals e2 的元素對e1和e2,並且最多包含乙個 null 元素。正如其名稱所暗示的,此介面模仿了數學上的 set 抽象。hashset與treeset都是基於set介面的實現類。其中treeset...