【问题标题】:Hashmap with class objects [duplicate]带有类对象的哈希图[重复]
【发布时间】:2020-10-11 08:32:12
【问题描述】:

我有一个 Test 类,它的具有相同值 (101,"abc") 的对象被创建了两次。我将这两个对象作为键插入到 Hashmap 中。我想了解内部功能,为什么当我的两个键都相同时,我将大小变成两个地图,它可能应该覆盖?

import java.util.HashMap;
import java.util.Map;
public class Test{
int id;
String name;
public static void main(String[] args) {
Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");
//Test e3 = new Test(101,"abc");
Map<Test, String> map = new HashMap<>();
map.put(e1, "XYZ");
map.put(e2, "CDF");
String value = map.get(e2);
System.out.println( "VALUE : "+value);
}
public Test(int id, String name) {
this.id = id;
this.name=name;
}}

【问题讨论】:

标签: java hashmap


【解决方案1】:
Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");

创建 2 个不同类型的 Test 对象。这意味着已为 e1 和 e2 分配了 2 个不同的内存空间。

现在让我们了解 map(比如 Hash Map)如何识别键的唯一性(用更简单的话说,映射如何知道您尝试插入的键是否已经存在)。答案是,map 调用 hashcode() 和 equals() 方法来比较 map 中存在的键与您尝试插入的键。

我们已经知道所有的类都有一个默认的父类 ObjectTest 类没有实现 hashcode() & equals();所以当map尝试调用它们时,对象类方法被调用了。 由于 Object 的类 equals 仅当比较的两个对象都引用相同的对象引用时才返回 true 并且 hashcode() 也是如此,这里 e1 和 e2 显然是不同的对象。所以你有两个条目。

解决方案是按照上面@Kapil 的建议覆盖 equals() 和 hashcode()。

【讨论】:

    【解决方案2】:

    除非您在 Test 类中覆盖 hashcode() 和 equals() 方法,否则哈希图中将有两个对象。如果您在 Test 类的 id 属性上覆盖这两个方法,那么具有相同 id 的两个键将被视为重复,您将看到预期的行为。

    下面的示例表明,如果两个对象的 id 相等,则您希望它们相等 -

    @Override
            public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + id;
                return result;
            }
            @Override
            public boolean equals(Object obj) {
                if (this == obj)
                    return true;
                if (obj == null)
                    return false;
                if (getClass() != obj.getClass())
                    return false;
                Test other = (Test) obj;
                if (id != other.id)
                    return false;
                return true;
            }
    

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 2012-10-02
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2016-06-20
      • 2014-07-05
      • 2011-01-04
      • 2020-10-11
      相关资源
      最近更新 更多