set是j**a中乙個不包含重複元素的collection。更正式地說,set 不包含滿足e1.equals(e2)
的元素對e1
和e2
,並且最多包含乙個 null 元素。正如其名稱所暗示的,此介面模仿了數學上的 set 抽象。
hashset與treeset都是基於set介面的實現類。其中treeset是set的子介面sortedset的實現類。set介面及其子介面、實現類的結構如下所示:
|——sortedset介面——treeset實現類
set介面——
|——hashset實現類
|——linkedhashset實現類
hashset實現set 介面,由雜湊表(實際上是乙個 hashmap 例項)支援。它不保證集合的迭代順序;特別是它不保證該順序恆久不變。此類允許使用
null
元素。hashset
為基本操作提供了穩定性能,這些基本操作包括 add、remove、contains 和 size,假定雜湊函式將這些元素正確地分布在桶中。對此集合進行迭代所需的時間與 hashset 例項的大小(元素的數量)和底層 hashmap 例項(桶的數量)的「容量」的和成比例。因此,如果迭代效能很重要,則不要將初始容量設定得太高(或將載入因子設定得太低)。hashset的實現是不同步的。如果多個執行緒同時訪問乙個集合,而其中至少乙個執行緒修改了該集合,那麼它必須 保持外部同步。
當需要向hashset中放置元素時,應該為要存放到雜湊表的各個物件定義hashcode()和equals();
例如:
packagecom.test.www;
import
j**a.util.hashset;
import
j**a.util.iterator;
public
class
hashsettest
}}class
student
//hashset要重寫hashcode和equals方法
public
string tostring()
public
inthashcode()
public
boolean
equals(object o)
}
treeset類實現 set 介面,該介面由 treemap 例項支援。此類保證排序後的 set 按照公升序排列元素,根據使用的構造方法不同,可能會按照元素的自然順序 進行排序,或按照在建立 set 時所提供的比較器進行排序。
是乙個有序集合,元素中安公升序排序,預設是按照自然順序進行排序,意味著treeset中元素要實現comparable介面;
我們可以構造treeset物件時,傳遞實現了comparator介面的比較器物件.
例如:
packagecom.test.www;
import j**a.util.*;
public
class
treesettest
}}class students implements
comparable
static
class comparetostudent implements
comparator
//定義乙個內部類來實現比較器
return
rulst;}}
public
intcompareto(object o)
//寫具體的比較方法
return
result;
}public
string tostring()
}
hashset是基於hash演算法實現的,其效能通常優於treeset,我們通常都應該使用hashset,在我們需要排序的功能時,我門才使用treeset;
compareto這個方法,當等於的時候就返回0,當大於就返回1,當小於就返回-1,就這麼簡單。
treeset型別是j2se中唯一可實現自動排序的型別,用法如下:
packagecom.test.www;
import
j**a.util.comparator;
public
class mycomparatorimplements comparator
return ((comparable) arg0).compareto(arg1) * -1;
}}
packagecom.test.www;
import
j**a.util.iterator;
import
j**a.util.treeset;
public
class
treesettest
//-------------新增自定義排序-----------------
treesettreeset2 = new treeset(mycomparator);
treeset2.add("c");
treeset2.add("a");
treeset2.add("b");
iterator
iterator2 =treeset2.iterator();
while
(iterator2.hasnext())
}}
執行結果:
a b
c c b a
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使用方法的區別解析
一.問題 1.hashset,treeset是如何使用hashcode 和equal 方法的 2.treemap,treeset中的物件何時以及為何要實現comparable介面?二.回答 1.hashset是通過hashmap實現的,treeset是通過treemap實現的,只不過set用的只是m...