“嗯,你的處理器怎麼樣了?”

“沒事,在液氮裡坐了一個小時,煥然一新!”

“很好,那我們繼續吧。”

“集合收藏。”

從數學上講,集合是一組唯一的元素。因此,在編程中,Set 是唯一元素的集合,即不允許您存儲相同元素的集合。

“我不知道Ellie有沒有給你展示過Set的繼承層次。如果沒有,這裡是:”

Set 和 Queue 接口的實現 - 1

HashSet是一個集合,它使用hashCode () 方法返回的哈希值在內部存儲元素。”

“為簡單起見,HashSet<E> 存儲一個 HashMap<E, Object> 對象,該對象將 HashSet 的值存儲為鍵。”

“哇!”

“使用哈希碼可以讓您快速搜索、添加和刪除集合中的元素。”

“但請記住,您的類必須正確實現hashCode 和 equals方法,以便將您的類的對象添加到 Set 中,並在那裡正確地找到它們。”

“這兩種方法在HashSet/HashMap內部都被大量使用。 ”

“如果你忘記實現hashCode () 方法,那麼你就有可能無法在 Set 中找到你的對象,即使它存在。”

“是的,我記得,我記得,這件事你早跟我說過,我都聽說了。”

“好的。那這裡有一些對你更有用的信息。”

“假設你已經在你的類中正確地實現了hashCode 和 equals ,並且你愉快地將你的對象存儲在一個 Set 中。”

“但是你去改變其中一個對象,這樣你就改變了用於計算它的哈希值的內部數據。所以對象的哈希值發生了變化。”

“這意味著當你在 Set 中搜索它時,你可能找不到它。”

“哇!那是怎麼做到的?”

“這是使用哈希時眾所周知的陷阱。從本質上講,HashSet(和 HashMap)搜索只有在對像不可變時才能保證正常工作

“哇!什麼,沒有人對此採取任何行動?”

“每個人都假裝這個問題不存在。但這在採訪中經常出現,所以可能值得記住……”

LinkedHashSet是一個 HashSet,其元素也存儲在鍊錶中。普通 HashSet 不支持元素的排序。首先,它根本不是官方操作。其次,即使是內部順序也會在單個時發生顯著變化添加了元素。”

但是您可以從LinkedHashSet獲取一個迭代器,並使用它按照添加到 LinkedHashSet 的順序遍歷所有元素。它不會經常發生,但有時這是非常需要的。”

“我明白了。我喜歡為這些 «以防萬一» 場景提供課程。這種情況並不少見。”

" TreeSet是一個集合,它以按值排序的樹的形式存儲元素。一個TreeSet <E> 包含一個存儲所有這些值的TreeMap <E, Object>。這個TreeMap使用平衡的紅黑 樹來存儲元素。因此,它支持非常快速的添加、刪除和包含操作。”

“是的,我記得。我們最近才討論過這個問題。我也想過用在什麼地方。”

“事實證明,一些 Java 最流行的集合使用它。”

“是的。順便說一句,面試官經常問關於TreeSet 的問題。他們通常是想騙你。他們會說,‘如果 TreeSet 使用二叉樹,那麼所有元素都可以形成一個長分支,所以搜索需要一個很長一段時間。«現在是讓這個無禮的傢伙站在他的位置上的時候了,“即使是孩子也知道 TreeSet 和 TreeMap 使用平衡的紅黑樹,所以這種情況實際上是不可能的。»”

“啊,好想看看問這個問題的人的臉,說不定還能把那句話背下來……”

“但在實踐中,Set 並不像我最初想像的那麼簡單。”

“另一方面,Queue的情況要簡單得多:”

Set 和 Queue 接口的實現 - 2

" Queue實現了一個隊列。元素被添加到隊列的末尾並從前面取出。"

PriorityQueue實際上是Queue接口的唯一經典實現,不包括LinkedList,從技術上講,它也是一個隊列。”

“好了,我累了,今天就到這裡,下次再說。”