1. 程式人生 > 其它 >Java中三種Set型別用法、效能大比拼

Java中三種Set型別用法、效能大比拼

Java為開發者提供了大量的工具類,這給開發人員帶來了很大方便,但是選擇多了也有困擾,究竟用哪個類;我想選擇什麼,一是看自己具體需求,二是類本身的效能和用法;Java中提供了HashSet、TreeSet、LinkedHashSet三種常用的Set實現,以下具體分析它們的用法和效能。

網路配圖 我們使用Set的原因是Set集合不包含重複元素,HashSet、TreeSet和LinkedHashSet三種類型什麼時候使用它們,使用哪個這是一個很重要的選擇性問題,正確的選擇會大大提升程式執行效率;總結一下,如你的需求是要一個能快速訪問的Set,那麼就要用HashSet,如果你要一個排序Set,那麼你應該用TreeSet,如果你要記錄下插入時的順序時,你應該使用LinedHashSet。把握這幾個原則,是不是選擇起來就簡單多了。 Set介面的特性,Set介面繼承了Collection介面,Set集合中不能包含重複的元素,每個元素必須是唯一的,你只要將元素加入set中,重複的元素會自動移除。下面分三方面對它的三個實現類進行說明。 1、HashSet類:HashSet是採用hash表演算法來實現的,其中的元素沒有按順序排列,主要有add()、remove()以及contains()等方法;程式碼例子如下: 先定義一個實體類

class Apple implements Comparable<Apple>{
int size;
public Apple(int s) {
size = s;
}
public String toString() {
return size + "";
}
@Override
public int compareTo(Apple o) {
return size - o.size;
}
}
HashSet dset = new HashSet();
dset.add(new Apple(8));
dset.add(new Apple(1));
dset.add(new Apple(6));
dset.add(new Apple(7));
dset.add(new Apple(2));
Iterator iterator = dset.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

執行後輸出: 8 6 2 1 7 可以看到這是沒有順序的。

網路配圖 2、TreeSet類:TreeSet是採用樹結構實現(稱為紅黑樹演算法),元素是按順序進行排列,主要有add()、remove()以及contains()等方法,它們都是複雜度為O(log (n))的方法;它還提供了一些處理排序的set方法,如first(), last(), headSet(), tailSet()等。程式碼例子如下:

TreeSet tree = new TreeSet();
tree.add(28);
tree.add(58);
tree.add(38);
tree.add(18);
Iterator iterator = tree.iterator();
System.out.print("排序後的資料顯示: ");
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

執行後輸出如下: 排序後的資料顯示: 18 28 38 58 3、LinkedHashSet類:LinkedHashSet正好介於HashSet和TreeSet之間,它也是一個hash表,但它同時維護了一個雙鏈表來記錄插入的順序,基本方法的複雜度為O(1)。程式碼例子如下:

LinkedHashSet dset = new LinkedHashSet();
dset.add(new Apple(7));
dset.add(new Apple(6));
dset.add(new Apple(8));
dset.add(new Apple(10));
dset.add(new Apple(9));
Iterator iterator = dset.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}

執行輸出:7 6 8 10 9 輸出的順序和插入的順序是一樣的。

網路配圖 總之,它們各有優缺點,選擇用什麼,看自己需求,不過要說明一點HashSet速度是最快的;好了,今天學習到這裡,明天見!