这已经困扰了我很长一段时间了。基本上,每当我想将我自己的一组对象(我在这里称之为 MyObject)存储为地图中的键时,我无法获得键值,除非我在我的类中保存了相同的确切对象。即使我尝试覆盖 MyObject 中的 equals 方法,在比较具有相同值的 2 个对象时它通常返回 true,但没有任何改变。
只是为了给您演示一下我的意思:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(2, 3);
System.out.println(map.get(2)));
现在,正如您可能期望的那样,它在映射中搜索整数对象 2,然后打印出 3。如果整数不存在,则打印 null。到目前为止,一切都很好。
Map<String, Integer> map = new HashMap<String, Integer>();
map.put(new String("hi"), 3);
System.out.println(map.get(new String("hi")));
这也可以按预期工作。我们只是得到键“hi”的值。
Map<MyObject, Integer> map = new HashMap<MyObject, Integer>();
map.put(new MyObject(), 3);
System.out.println(map.get(new MyObject()));
即使“new MyObject()”和“new MyObject()”在技术上没有区别,它仍然返回 null,除非我将 new MyObject 作为实例保存在我的类中并将该实例用作获取方法。
与我的 MyObject 不同,如果键是字符串或整数,则映射很容易获取键值。这些类型只是特权还是有办法告诉地图:“嘿,新创建的对象与该列表中的对象相似”?地图如何比较对象?