【问题标题】:How does containsKey really work in Java when working with Map? [duplicate]使用 Map 时 containsKey 如何在 Java 中真正发挥作用? [复制]
【发布时间】:2019-08-04 00:55:50
【问题描述】:

containsKey 是如何真正起作用的?我知道如果我这样做:

 Map<String, Integer> map = new HashMap<>();
 map.put("user1", 1);
 map.put("user2", 2);
 map.put("user3", 3);

 System.out.println(map.containsKey("user1")); // true

containsKey 返回 true

但如果我这样做:

Map<Person, Integer> table = new HashMap<>();
table.put(new Person("Steve"), 33);
table.put(new Person("Mark"), 29);

System.out.println(table.containsKey(new Person("Steve"))); // false

那么为什么即使我有正确的密钥,我也会得到 false?如何使用其键检查 33 的值?

【问题讨论】:

  • 因为您的 Person 类没有(正确)实现 hashCode()equals()
  • 因为你还没有在你的类上实现equals(),所以Java只能检查这两个对象是否引用了相同的内存。这解释了平等在 Java 中的工作原理stackoverflow.com/questions/7520432/…

标签: java


【解决方案1】:

这里你使用字符串作为键

Map&lt;String, Integer&gt; map = new HashMap&lt;&gt;();

map.put("user1", 1);

并且 String 类 ia 实现了 HashCodeEquals 方法,因此它按预期工作。

当您使用Person 类对象作为键或任何自定义类时,您应该确保覆盖Hashcodeequals 方法。

HashMap 实现使用hashCode 查找桶,如果桶中存在多个条目,则使用equals

【讨论】:

    【解决方案2】:

    使用地图时,所有需要存储在地图中的对象都应该实现equals和hashcode

    这里是行为与您期望的一样的示例 Person 类:

    class Person {
            private String name;
    
            public Person(String name) {
                this.name = name;
            }
    
            public String getName() {
                return name;
            }
    
            @Override
            public boolean equals(Object obj) {
                if (obj == null || !(obj instanceof Person)) {
                    return false;
                }
    
                Person other = (Person) obj;
    
                return other.getName().equals(this.name);
            }
    
            @Override
            public int hashCode() {
                return this.name.hashCode();
            }
    
        }
    

    HashMap 使用 equals() 比较键是否相等 hashCode() 用于计算应插入项目的索引

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2012-07-17
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多