8

我对 Collections 框架中的集合有疑问。集合本身将如何识别重复项以及它将如何知道?谁能解释一下它是如何实现的?hashcode 和 equals 方法将如何出现?我需要一个简短的解释,因为这对我来说真的很重要。

4

6 回答 6

8

它大致是这样工作的

if (!collection.contains(element))
    collection.add(element);

而 contains 方法将使用 equals/hashcode。

在 TreeSet 中,元素存储在红黑树中,而 HashSet 使用 HashMap。

事实上,它添加到容器的方式是特定于元素的(树上的点,哈希表中的桶),因此添加本身使用 equals/hashcode。

于 2013-02-25T07:56:13.553 回答
7

这在用于Set.

不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。

于 2013-02-25T07:53:24.117 回答
3

实际实现取决于容器。HashMap查找给定的项目,hashCode然后通过使用测试插入的对象和存储的对象equals(这是要求a.equals(b)iff的原因之一b.equals(a))。

TreeMap另一方面,依赖于compareTo方法的结果(如果元素实现Comparablecompare由 a 实现的方法Comparator)。如果compare返回 0,则元素被视为“等于”。(注意compareTo应该与equals一致,即a.compareTo(b)==0iff a.equals(b))。

于 2013-02-25T08:01:10.127 回答
2

HashSet使用hashcode()toresolve bucket 对象应该去的地方和equals()方法来检查位于该桶上的对象的相等性

于 2013-02-25T07:53:28.670 回答
0

"你能用这些例子解释一下吗。s.add("123");s.add("123");"

对于上面在 Set 接口上下文中解释的查询,请参考下面的代码片段和解释。

public void setTest() {
    Set<String> obj = new HashSet<>();
    System.out.println(obj.add("123")); //Output : true
    System.out.println(obj.add("123")); //Output : false
}

如果您在上面的代码段中注意到,我们已经添加了 123 两次。第一次添加 SOP 将返回 true。然后第二次添加“123”,SOP 将返回 false。

由此我们可以理解,如果我们在 Set 中第二次或更多次添加相同的值,那么重复的值将被跳过

于 2017-12-05T13:04:32.830 回答
0

基本上 set 是一个接口,它有很多不同的实现,现在让我们以 HashSet 实现为例,为了回答你的问题,我下载了源代码并进入了 HashSet 类,然后我搜索了 add 方法,发现它使用 HashMap 来存储唯一值. 它使用要存储的值作为 HashMap 的键,并将键的对应值(即下面代码片段中的 PRESENT)作为常量值(该值是一个虚拟值),我们都知道 map 的键是唯一的。这就是它的工作原理。下面的代码:

private static final Object PRESENT = new Object();
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
于 2019-05-04T17:15:48.997 回答