Set是java中一個不包含重複元素的collection。更正式地說,set 不包含知足 e1.equals(e2)
的元素對 e1
和 e2
,而且最多包含一個 null 元素。正如其名稱所暗示的,此接口模仿了數學上的 set 抽象。java
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();this
例如:spa
import java.util.HashSet; import java.util.Iterator; public class HashSetTest { public static void main(String[] args) { HashSet hs=new HashSet(); /**//*hs.add("one"); hs.add("two"); hs.add("three"); hs.add("four");*/ hs.add(new Student(1,"zhangsan")); hs.add(new Student(2,"lishi")); hs.add(new Student(3,"wangwu")); hs.add(new Student(1,"zhangsan")); Iterator it=hs.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } class Student //HashSet要重寫hashCode和equals方法 { int num; String name; Student(int num,String name) { this.num=num; this.name=name; } public String toString() { return "num :"+num+" name:"+name; } public int hashCode() { return num*name.hashCode(); } public boolean equals(Object o) { Student s=(Student)o; return num==s.num && name.equals(s.name); } }
TreeSet類實現 Set 接口,該接口由 TreeMap 實例支持。此類保證排序後的 set 按照升序排列元素,根據使用的構造方法不一樣,可能會按照元素的天然順序 進行排序,或按照在建立 set 時所提供的比較器進行排序。是一個有序集合,元素中安升序排序,缺省是按照天然順序進行排序,意味着TreeSet中元素要實現Comparable接口;咱們能夠構造TreeSet對象時,傳遞實現了Comparator接口的比較器對象..net
例如:線程
import java.util.*; public class TreeSetTest { public static void main(String[] args) { //TreeSet ts=new TreeSet(); TreeSet ts=new TreeSet(new Students.compareToStudent()); ts.add(new Students(2,"zhangshan")); ts.add(new Students(3,"lishi")); ts.add(new Students(1,"wangwu")); ts.add(new Students(4,"maliu")); Iterator it=ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } } class Students implements Comparable { int num; String name; Students(int num,String name) { this.num=num; this.name=name; } static class compareToStudent implements Comparator //定義一個內部類來實現比較器 { public int compare(Object o1, Object o2) { Students s1=(Students)o1; Students s2=(Students)o2; int rulst= s1.num > s2.num ? 1 : (s1.num==s2.num ? 0 :-1); if(rulst==0) { rulst=s1.name.compareTo(s2.name); } return rulst; } } public int compareTo(Object o) //寫具體的比較方法 { int result; Students s=(Students)o; result=num >s.num ? 1:(num==s.num ? 0 : -1); if(result==0) { result=name.compareTo(s.name); } return result; } public String toString() { return num+":"+name; } }
HashSet是基於Hash算法實現的,其性能一般優於TreeSet,咱們一般都應該使用HashSet,在咱們須要排序的功能時,我門才使用TreeSet;code
compareTo這個方法,當等於的時候就返回0,當大於就返回1,當小於就返回-1,就這麼簡單。對象
TreeSet類型是J2SE中惟一可實現自動排序的類型,用法以下:
import java.util.Comparator; public class MyComparator<T> implements Comparator<T> { public int compare(T arg0, T arg1) { if (arg0.equals(arg1)) { return 0; } return ((Comparable<T>) arg0).compareTo(arg1) * -1; } } import java.util.Iterator; import java.util.TreeSet; public class TreeSetTest { /** *//** * @param args */ public static void main(String[] args) { MyComparator<String> myComparator = new MyComparator<String>(); // /////////////////////不添加自定義排序 TreeSet<String> treeSet1 = new TreeSet<String>(); treeSet1.add("c"); treeSet1.add("a"); treeSet1.add("b"); Iterator<String> iterator1 = treeSet1.iterator(); while (iterator1.hasNext()) { System.out.println(iterator1.next()); } // /////////////////////添加自定義排序 TreeSet<String> treeSet2 = new TreeSet<String>(myComparator); treeSet2.add("c"); treeSet2.add("a"); treeSet2.add("b"); Iterator<String> iterator2 = treeSet2.iterator(); while (iterator2.hasNext()) { System.out.println(iterator2.next()); } } }
運行結果:
a
b
c
c
b
a
轉自:http://blog.csdn.net/cyq1984/article/details/6925536