【问题标题】:Are there problems of implementing HashSet using HashMap?使用 HashMap 实现 HashSet 有问题吗?
【发布时间】:2012-07-25 17:10:38
【问题描述】:

在 java 中,HashSet 是使用 HashMap 实现的。因此,当我们向集合中添加项目时,会执行以下代码。

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

当两个不同但具有相同哈希值的对象被添加到 HashSet 时会发生什么;它(HashSet)会包含两个对象还是会发生什么?

【问题讨论】:

    标签: java hashmap hashset


    【解决方案1】:

    hashmap 使用.equals().hash()。除非.equals() 返回true,否则两件事是不一样的。哈希集也是如此。

    因此,如果两个对象不同但具有相同的哈希值,则它们都将被存储并且都可用,因为.equals() 仍将返回false

    确实,在内部,哈希值用于决定存储对象的位置,但仍然可以存储具有相同哈希值的多个对象(由于它变得更加复杂,因此会稍微降低性能,但仅此而已)。

    【讨论】:

      【解决方案2】:

      是的,hashmap 将包含这两个元素。我找不到它使用的具体方法,但处理冲突的流行方法包括为每个存储桶使用链表,或者只是将元素粘贴在附近的空存储桶中。

      【讨论】:

      • Java 的HashMap 实现确实使用链表样式结构(内部称为Entry)来表示一个桶。以下表达式用于确定给定键的存储桶:hashcode & (numBuckets-1)。完成后,使用 .equals() 检查存储桶中的键,然后将元素替换或添加到该存储桶中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2016-10-12
      • 2015-07-06
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多