“嗯,你的处理器怎么样了?”

“没事,在液氮里坐了一个小时,焕然一新!”

“很好,那我们继续吧。”

“集合收藏。”

从数学上讲,集合是一组唯一的元素。因此,在编程中,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,从技术上讲,它也是一个队列。”

“好了,我累了,今天就到这里,下次再说。”