1. 程式人生 > >Java--hashSet和TreeSet的區別

Java--hashSet和TreeSet的區別

Java–hashSet和TreeSet的區別

1. hashSet

底層是使用了雜湊表來支援的,特點: 存取速度快.

實現原理: 往Haset新增元素的時候,HashSet會先呼叫元素的hashCode方法得到元素的雜湊值 ,然後根據元素 的雜湊值經過一系列的運算,就可以算出該元素在雜湊表中的儲存位置。

  • 如果算出元素儲存的位置目前沒有儲存任何元素,那麼元素就可以直接儲存到該位置上。
  • 如果算出該元素的儲存位置目前已經存在有其他的元素了,那麼會呼叫該元素的equals方法與該位置的元素再比較一次;如果equals返回值是true,那麼該元素與這個位置上的元素就會被視為重複元素,不允許新增,反之,則可以新增。

2. TreeSet

底層是使用了紅黑樹(二叉樹)資料結構實現的, 特點:會對元素進行排序儲存。

  1. 往TreeSet新增元素的時候,如果元素本身具備自然順序的特性,那麼就會自動對元素就行排序。
  2. 往TreeSet新增元素的時候,如果元素本身不具備自然順序的特性,那麼元素所屬的類必須要實現Comparable介面,把元素的比較規則定義在CompareTo方法中。
  3. 往TreeSet新增元素的時候,如果元素本身不具備自然順序的特性,而且元素所屬的類沒有實現COmparable介面,那麼必須要在建立TreeSet物件的時候傳入比較器。例如:
//自定義一個比較器
class MyComparator implements
Comparator<Person>{ @Override public int compare(Person p1, Person p2) { return p1.id-p2.id; } }
  1. 如果比較的方法(CompareTo 或者Compare )返回的是0的時候,那麼該元素就被視為重複元素,不允許被新增。