繁体   English   中英

重写equals方法以在插入HashMap时返回false

[英]Override equals method to return false while inserting to HashMap

import java.util.HashMap;
import java.util.Map;

public class MapTest {
    public String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Override
    public int hashCode(){
        return 100;
    }
    @Override
    public boolean equals(Object te){
        return false;
    }
    public static void main(String[] args) {
        MapTest obj = new MapTest();
        MapTest obj1 = new MapTest();
        obj.setId("test");
        obj1.setId("test2");
        Map<MapTest,Integer> test = new HashMap<MapTest,Integer>(); 
        test.put(obj, 1000);
        test.put(obj1, 2000);
        test.put(new MapTest(), 4000);
        System.out.println(test.get(obj)); //1000
        System.out.println(test.get(obj1));//2000
        System.out.println(test.get(new MapTest()));//Null
        System.out.println(test.size());//3
    }

}

这里的对象返回相同的哈希码,因此为了避免在将数据添加到HashMap时被覆盖,我有一个equals方法返回false。 现在,当我使用get时,我得到了正确的数据示例obj1和obj提供了确切的值,但是我的问题是,当它们的哈希码相同时,java如何区分不同的对象并从hashmap返回它们的确切值。

答案在于HashMap如何实现get方法。 当它对照映射中存储的键检查给定键的相等性(当它们具有相等的哈希码值时)时,它首先进行引用相等性检查。 下面的代码取自Java 8的get实现,如您所见, ==检查密钥。

if (e.hash == hash &&
   ((k = e.key) == key || (key != null && key.equals(k))))
      return e;

如果您使用另一个具有相同ID值的对象,则该对象将无法工作,因为在您的对象中没有定义结构相等性。 尝试这个:

TestMap obj2 = new TestMap();
obj2.setId("test");
System.out.println(test.get(obj2)); // Returns Null

哈希码等于等于是哈希图决定两个键是否相同的首要要求,但不是唯一的/

(key1 == key2 || key1.equals(key2))也需要。

如果将equals方法更改为始终返回true,则可以看到地图中最后只有一个元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM