轉:Java中的HashSet, TreeSet, HashMap, TreeMap

herosoft發表於2009-07-07

Java中的HashSet和TreeSet

文/ Iangao

一. 問題

1. HashSet,TreeSet是如何使用hashCode()和equal()方法的

2. TreeMap,TreeSet中的物件何時以及為何要實現Comparable介面?

二. 回答:

1. HashSet是透過HashMap實現的,TreeSet是透過TreeMap實現的,只不過Set用的只是Map的key
2. Map的key和Set都有一個共同的特性就是集合的唯一性.TreeMap更是多了一個有序性.
3. hashCode和equal()是HashMap用的, 因為無需排序所以只需要關注定位和唯一性即可.
a. hashCode是用來計算hash值的,hash值是用來確定hash表索引的.
b. hash表中的一個索引處存放的是一張連結串列, 所以還要透過equal方法迴圈比較鏈上的每一個物件
才可以真正定位到鍵值對應的Entry.
c. put時,如果hash表中沒定位到,就在連結串列前加一個Entry,如果定位到了,則更換Entry中的value,並返回舊value

[@more@]d. 覆寫key的hashCode()和equal()時一定要注意,不要把它們和可變屬性關聯上,
否則屬性變了之後hashCode會變,equal也會為false, 這樣在Map中就找不不到它了
而且這樣的物件因為找不到它所以得不到釋放,這樣就變成了一個無效引用了(相當於記憶體洩漏).
4. 由於TreeMap需要排序,所以需要一個Comparator為鍵值進行大小比較.當然也是用Comparator定位的.

a. Comparator可以在建立TreeMap時指定,這時排序時使用Comparator.compare
b. 如果建立時沒有指定Comparator,那麼就會使用key.compareTo()方法,這就要求key必須實現Comparable介面.
c. TreeMap是使用Tree資料結構實現的,所以使用compare介面就可以完成定位了.


發表於 @ 2008年11月18日 16:46:00|評論(0)|收藏

新一篇: Java String中的HashCode和equal | 舊一篇: Java同步技術(九)

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/Iangao/archive/2008/11/18/3326991.aspx

本文來自CSDN部落格,轉載請標明出處:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/220284/viewspace-1023888/,如需轉載,請註明出處,否則將追究法律責任。

相關文章