一道简单的Map题目求解答

bingo_sys 2014-10-28 09:35:29
package Map;

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

class Dog{
String name;
Dog(String name){this.name = name;}
@Override
public boolean equals(Object arg0) {
// TODO Auto-generated method stub
if( (arg0 instanceof Dog) && (((Dog)arg0).name == name) ){
System.out.println(this.name + " " + ((Dog)arg0).name + " " + "true");
return true;
}
else{
System.out.println(this.name + " " + ((Dog)arg0).name + " " + "false");
return false;
}

}
@Override
public int hashCode() {
// TODO Auto-generated method stub
System.out.println(this.name.length());
return this.name.length();
}

@Override
public String toString() {
// TODO Auto-generated method stub
return "dog is " + this.name;
}
}


public class MapTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Object, Object> m = new HashMap<Object, Object>();
//add some key/value pairs
Dog d1 = new Dog("clover");
d1.name = "magoli";
m.put(d1, "The value is " + d1);
System.out.println(m);

d1.name = "cagnolia";
System.out.println("4.1 d1: " + d1);
System.out.println("4.1 result--------------: " + m.get(d1)); // #4.1
System.out.println(m);

}
}

上面这段代码的运行结果是
4.1 d1: dog is cagnolia
4.1 result--------------: null
map中的内容是{dog is cagnolia=The value is dog is magoli}
那么如果是map是根据key来返回value的话,那么为什么key已经变化了就不能返回value呢,查找的结果就是null呢

然后我把Dog里面的hashcode改成了return 4;就是一个很没意思的返回数值,运行结果就变成了
4.1 d1: dog is cagnolia
4.1 result--------------: The value is dog is magoli
map中的内容是{dog is cagnolia=The value is dog is magoli},求高手帮忙解答下,非常感谢!!!
...全文
385 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sam-fat-chang 2014-11-14
  • 打赏
  • 举报
回复
查看hashmap的实现源码 答案就在那里
sjlzcj 2014-11-01
  • 打赏
  • 举报
回复
同学,你用的是hashmap实现类 其实 hashmap底层就是用的哈希表作为数据结构的 而 <Key> 的hashcode 是用来在哈希表中寻址的 因为哈希表必然会存在哈希冲突的问题,所以在哈希冲突的时候使用<Key>的equals方法来判断是否是相同的<Key> 而你的例子里equals 重写的有问题 不妨把equals 内改成 returned this.name.equals(arg0.toString());试试
965攻城狮 2014-10-31
  • 打赏
  • 举报
回复
引用 2 楼 u011564172 的回复:
一个非常好的问题,关系到map的put和get方法,put会调用equals判断对象是否存在,这和你说的这个没关系,你的问题主要关乎get方法,get会调用hashcode方法,根据得到的值去查找对象。所以,当你hashcode方法返回return this.name.length();时,你把magoli改为cagnolia,两者长度不一样,所以找不到了,如果改为cagnol,即长度一致就可以找到了,return 4道理相同
嗯,说的有道理
lliiqiang 2014-10-30
  • 打赏
  • 举报
回复
涉及到hashCode()方法.最好设置为如果有可能相等则hashcode相同不变的.
Mr_JieLQ 2014-10-29
  • 打赏
  • 举报
回复
一个非常好的问题,关系到map的put和get方法,put会调用equals判断对象是否存在,这和你说的这个没关系,你的问题主要关乎get方法,get会调用hashcode方法,根据得到的值去查找对象。所以,当你hashcode方法返回return this.name.length();时,你把magoli改为cagnolia,两者长度不一样,所以找不到了,如果改为cagnol,即长度一致就可以找到了,return 4道理相同
快乐的2 2014-10-29
  • 打赏
  • 举报
回复
你用的是HashMap,这个map在存储数据的时候是根据key的hashCode来决定存储在哪个数组里。如果key的hashCode变化了的话就会导致HashMap在根据key的hashCode查找数组时找到的不是正确的数组,所以也就不能定位value了。 而你的Dog类的hashCode是根据name.length来的,那么当你的name长度变化后,就不能在HashMap中找到对应的value了。
bingo_sys 2014-10-28
  • 打赏
  • 举报
回复
自己顶一下好了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧