import java.util.HashMap;
import java.util.Map;class Dog{
public String name;
public Dog(String name){
this.name = name;
}
public boolean equals(Object o){
if((o instanceof Dog) && (((Dog)o).name == name)){
return true;
}else{
return false;
}
}
public int hashCode(){
return name.length();
}
public String toString(){
return name;
}
}public class Test111226{
public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
Dog d1 = new Dog("clover");
m.put(d1, "DDDDOG");
System.out.println(m.get(d1));
d1.name = "magnolia";
for(Object o: m.keySet()){
System.out.println(o.hashCode());
System.out.println(o.toString());
}
System.out.println("================");
System.out.println(d1.hashCode());
System.out.println(d1.toString());
System.out.println("----------------");
System.out.println(m.get(d1));
}
}
输出:
DDDDOG
8
magnolia
================
8
magnolia
----------------
null请问:为什么第一次m.get(d1)的时候能返回"DDDDOG",而将d1.name修改后就返回了null(修改d1的name后,可以看到map中的key的hashCode和name也跟着变了,hashCode和equals仍然相同,为什么get不到呢?)
解决方案 »
- 打开JNLP文件,总是显示调用Java VM(execv)错误,高手进!
- 谁帮我看看怎么改啊,关键问题是 一个2维数组和jTable1,空指针。(连数据库的)
- int m= Integer.parseInt(str.charAt(i))??
- 写二进制文件
- 多个JInternalFrame的重叠问题!
- 用哪个类型替代ResultSet来返回
- application的窗口中不能画图形?
- java 中图像保存到数据库
- 请高手分析一下出现下面这种情况的可能原因
- 关于Java线程沉睡的问题相求
- 正则匹配字符串里的所有img标签并找到src和alt的值
- UDP协议通信,服务器端收到数据后如何通知客户端数据已经收到
keySet返回key的集合,遍历输出的话是肯定没问题的了。
但是两个equals的对象, hashcode一定相同。 楼主现在明白了吗??
改变了m中那个key的值,但是并没有重新放入,所以存储的位置没有变,但是因为名字改变了,equals判断的时候会调用name,所以equals被影响了?
两者连hashcode()都不一定,又怎么能是同一个对象列?
import java.util.HashMap;
import java.util.Map;class Dog{
public String name;
public Dog(String name){
this.name = name;
}
public boolean equals(Object o){
if((o instanceof Dog) && (((Dog)o).name == name)){
return true;
}else{
return false;
}
}
public int hashCode(){
return name.length();
}
public String toString(){
return name;
}
}public class Test111226{
public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
Dog d1 = new Dog("clover");
m.put(d1, "DDDDOG");
System.out.println(m.get(d1));
//d1.name="123456";//输出DDDDOG
d1.name="1234567";//输出null,因为hashCode改变了。
for(Object o: m.keySet()){
System.out.println(o.hashCode());
System.out.println(o.toString());
}
System.out.println("================");
System.out.println(d1.hashCode());
System.out.println(d1.toString());
System.out.println("----------------");
System.out.println(m.get(d1));
}
}