【问题标题】:Equals and HashMap/HashSet等于和 HashMap/HashSet
【发布时间】:2017-06-05 07:33:52
【问题描述】:

如果我覆盖模型类中的 equals 方法并始终返回 false。并且 hashCode 总是返回一个常量值。如果我创建一个对象并将其添加到 Set HashSet/HashMAp 如何检测重复项?

public class Employee {

   int id;
   String name;
   @Override
   equals(){ 
   return false;
       }
   }

       public static void main(String[] args) {

          HashMap<Employee,String> hk= new HashMap<Employee,String>();
          Employee e1 = new Employee();
          e1.setId(18);
          e1.setName("roohi");
          hk.put(e1, "hello");
          hk.put(e1, "hello");
          }

如果 Equals 方法返回 false,即 e1.equals(e1) 返回 false。所以值应该被添加两次,但它只添加了一个。谁能解释一下。我在 HashCode 和 equals 合同上搜索并清除了我的概念,但在这里我失败了。

【问题讨论】:

  • 不会的,都是单独的条目(在同一个桶中)

标签: equals hashcode


【解决方案1】:

如果你仔细看看 Map.put 方法

public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

如果你注意到这行代码

 if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

虽然您已经覆盖了 equal 方法,但 (k = e.key) == key 的计算结果仍然为 true,它会覆盖旧条目。

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多