【发布时间】:2013-10-09 12:25:18
【问题描述】:
这已经困扰了我很长一段时间了。基本上,每当我想将我自己的一组对象(我在这里称之为 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 作为实例保存在我的类中并将该实例用作get 方法的参数。
与我的 MyObject 相反,如果键是字符串或整数,则映射很容易抓取键值。这些类型只是特权还是有办法告诉地图:“嘿,新创建的对象与该列表中的对象相似”?地图如何比较对象?
【问题讨论】:
-
Map 将根据实现检查键。 HashMap 使用哈希码来做。
-
@porfiriopartida 是否有另一个地图可以用来比较两个相似的对象?
-
是的,地图文档中很少。只需谷歌搜索 java.util.Map 并查看所有已知的实现类部分。
-
@Slanec 是的,这正是我想要的。可能只是用谷歌搜索了错误的标签。