HashSet和TreeSet 的區別與分析

2022-09-11 22:24:22 字數 2728 閱讀 4521

set是j**a中乙個不包含重複元素的collection。更正式地說,set 不包含滿足e1.equals(e2)的元素對e1e2,並且最多包含乙個 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();

例如:

package

com.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介面的比較器物件.

例如:

package

com.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中唯一可實現自動排序的型別,用法如下:

package

com.test.www;

import

j**a.util.comparator;

public

class mycomparatorimplements comparator

return ((comparable) arg0).compareto(arg1) * -1;

}}

package

com.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...