我正在使用哈希映射。
下面是示例代码。
MyKey 和 MyValue 类以简单的方式从 Object 继承。
Java 文档说对象和方法 hashCode() 和 equals():
“在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 不需要这种实现技术编程语言。)”
“Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x = = y 的值为真)。”
我的问题是:
我可以相信 HashMap 在我的示例中有效吗?如果不是,在不重写方法 hashCode() 和 equals() 的情况下,将简单对象放入 map 中的正确方法是什么?
我不确定,但我听说 Java 可能会在程序执行期间更改用户对象的位置和地址(是 GC 可能会这样做吗?)
如果 key2 的地址和哈希码在该行之前发生了变化
MyValue v = m.get(key2);
那么调用 m.get(key2) 会返回错误的值,null?
如果这是真的,那么我相信 IdentityHashMap() 出于同样的原因也是无用的。
class MyKey
{
Integer v;
//<Perhaps more fields>
MyKey(Integer v) {this.v=v;}
}
class MyValue
{
String s;
//<Perhaps more fields>
MyValue(String s) {this.s = s;}
}
Then some code:
Map<MyKey,MyValue> m = new HashMap<MyKey,MyValue>();
MyKey key1 = new MyKey(5);
MyKey key2 = new MyKey(6);
MyKey key3 = new MyKey(7);
m.put(key1, new MyValue("AAA"));
m.put(key2, new MyValue("BBB"));
m.put(key3, new MyValue("CCC"));
.
.
//Is it sure that I will get value "AAA" here
//if entry with key2 has not been removed from map m?
MyValue v = m.get(key2);
System.out.println("s="+v.s);