问题描述
packageMap;importjava.util.HashMap;importjava.util.Map;classDog{Stringname;Dog(Stringname){this.name=name;}@Overridepublicbooleanequals(Objectarg0){//TODOAuto-generatedmethodstubif((arg0instanceofDog)&&(((Dog)arg0).name==name)){System.out.println(this.name+""+((Dog)arg0).name+""+"true");returntrue;}else{System.out.println(this.name+""+((Dog)arg0).name+""+"false");returnfalse;}}@OverridepublicinthashCode(){//TODOAuto-generatedmethodstubSystem.out.println(this.name.length());returnthis.name.length();}@OverridepublicStringtoString(){//TODOAuto-generatedmethodstubreturn"dogis"+this.name;}}publicclassMapTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubMap<Object,Object>m=newHashMap<Object,Object>();//addsomekey/valuepairsDogd1=newDog("clover");d1.name="magoli";m.put(d1,"Thevalueis"+d1);System.out.println(m);d1.name="cagnolia";System.out.println("4.1d1:"+d1);System.out.println("4.1result--------------:"+m.get(d1));//#4.1System.out.println(m);}}上面这段代码的运行结果是4.1d1:dogiscagnolia4.1result--------------:nullmap中的内容是{dogiscagnolia=Thevalueisdogismagoli}那么如果是map是根据key来返回value的话,那么为什么key已经变化了就不能返回value呢,查找的结果就是null呢然后我把Dog里面的hashcode改成了return4;就是一个很没意思的返回数值,运行结果就变成了4.1d1:dogiscagnolia4.1result--------------:Thevalueisdogismagolimap中的内容是{dogiscagnolia=Thevalueisdogismagoli},求高手帮忙解答下,非常感谢!!!
解决方案
解决方案二:
自己顶一下好了
解决方案三:
一个非常好的问题,关系到map的put和get方法,put会调用equals判断对象是否存在,这和你说的这个没关系,你的问题主要关乎get方法,get会调用hashcode方法,根据得到的值去查找对象。所以,当你hashcode方法返回returnthis.name.length();时,你把magoli改为cagnolia,两者长度不一样,所以找不到了,如果改为cagnol,即长度一致就可以找到了,return4道理相同
解决方案四:
你用的是HashMap,这个map在存储数据的时候是根据key的hashCode来决定存储在哪个数组里。如果key的hashCode变化了的话就会导致HashMap在根据key的hashCode查找数组时找到的不是正确的数组,所以也就不能定位value了。而你的Dog类的hashCode是根据name.length来的,那么当你的name长度变化后,就不能在HashMap中找到对应的value了。
解决方案五:
涉及到hashCode()方法.最好设置为如果有可能相等则hashcode相同不变的.
解决方案六:
引用2楼u011564172的回复:
一个非常好的问题,关系到map的put和get方法,put会调用equals判断对象是否存在,这和你说的这个没关系,你的问题主要关乎get方法,get会调用hashcode方法,根据得到的值去查找对象。所以,当你hashcode方法返回returnthis.name.length();时,你把magoli改为cagnolia,两者长度不一样,所以找不到了,如果改为cagnol,即长度一致就可以找到了,return4道理相同
嗯,说的有道理
解决方案七:
同学,你用的是hashmap实现类其实hashmap底层就是用的哈希表作为数据结构的而<Key>的hashcode是用来在哈希表中寻址的因为哈希表必然会存在哈希冲突的问题,所以在哈希冲突的时候使用<Key>的equals方法来判断是否是相同的<Key>而你的例子里equals重写的有问题不妨把equals内改成returnedthis.name.equals(arg0.toString());试试
解决方案八:
查看hashmap的实现源码答案就在那里