“嗯,你的处理器怎么样了?”
“没事,在液氮里坐了一个小时,焕然一新!”
“很好,那我们继续吧。”
“集合收藏。”
从数学上讲,集合是一组唯一的元素。因此,在编程中,Set 是唯一元素的集合,即不允许您存储相同元素的集合。
“我不知道Ellie有没有给你展示过Set的继承层次。如果没有,这里是:”
“ 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的情况要简单得多:”
" Queue实现了一个队列。元素被添加到队列的末尾并从前面取出。"
“ PriorityQueue实际上是Queue接口的唯一经典实现,不包括LinkedList,从技术上讲,它也是一个队列。”
“好了,我累了,今天就到这里,下次再说。”
GO TO FULL VERSION