一道简单的Map题目求解答

问题描述

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的实现源码答案就在那里

时间: 2024-11-10 07:09:04

一道简单的Map题目求解答的相关文章

继承与多态-C++一道关于继承的题目,求大神解答,感激不尽

问题描述 C++一道关于继承的题目,求大神解答,感激不尽 Dynamic_cast Total: 65 Accepted: 22 Time Limit: 1sec Memory Limit:256MB Description Three classes A, B and C are shown below: class A { public: virtual ~A() {}; }; class B: public A {}; class C: public B {}; You are to im

代码分析-一道Java笔试题,求解答(关于类的加载与初始化)

问题描述 一道Java笔试题,求解答(关于类的加载与初始化) 自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢! public class Alibaba { public static int k = 0; public static Alibaba t1 = new Alibaba("t1"); public static Alibaba t2 = new Alibaba("t2"); public static int i =

c语言-数据结构C语言版10道实习题目求解答!!

问题描述 数据结构C语言版10道实习题目求解答!! 除有特别说明外,每个题目请以自然语言.形式化表述(伪码.流程图等).程序代码三种方式描述. 顺序结构线性表LA与LB的节点关键字为整数.LA与LB的元素按非递减有序,线性表空间足够大.试给出一种高效算法,将LB中的元素合并到LA中,使新的LA元素仍保持非递减有序.高效是指最大限度的避免移动元素. 请写一个算法将线性表(a1,a2,-,an)逆置为(an,an-1,-,a1). 在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,

c++问题-一道简单的c++题目,求解此段代码错哪了

问题描述 一道简单的c++题目,求解此段代码错哪了 题目是第四题,求解此段代码错哪了 解决方案 你的sum每次枚举完n后,要清0 解决方案二: i在每次循环结束都要置0或1 否则从第二轮循环开始i都是从上次结束的地方开始的 所以没有输出

gui- 新手求教一道简单的字符串题目。。

问题描述 新手求教一道简单的字符串题目.. 假设一道包含n个单词的题,经蓝神读过之后,虽然单词的长度和 数量都没有变化,但内容可能已经面目全非了.现在,蓝神的队友需要你帮忙计算一下原题与蓝神读过之 后的题的相似度.单个单词相似度的计算方法是蓝神读之前和读过之后没有变化的字母个数除以单词长度 乘上百分之百,总的相似度等于所有单词相似度的平均值. Input 第一行一个整数T(T <= 200),代表蓝神读了T次题.每次第一行一个整数n(0 < n <= 100),代表这次的题有n个单词,接

c语言题目求解答~~~~~

问题描述 c语言题目求解答~~~~~ 自然数列1,2,3,4,5,......大家都很熟悉,现将自然数列写成一排,数字中间不留空格等任何分隔符号就成了如下这样123456789101112131415161718192021......这是一个很长很长的串,现要求在这个串中找到一个最先出现给定子串的位置.例如给定子串1112,这该子串最先出现在串中第12个字符位置为了能简化处理,我们保证评判时给定的子串在串中一定出现,且位置不大于10000. 输入格式 给定的子串(一行由数字字符构成的字符串,不

oop-一道简单的OOP题目……不会做……求源程序 半小时内速求……

问题描述 一道简单的OOP题目--不会做--求源程序 半小时内速求-- 有个虚拟足球俱乐部的球队经济人又新招了5名队员,他写了下面的代码,为新队员建了 一个数组,并输出数组的所有元素.其中字符串是队员的名字,而数字则是队员的年龄. 不过有个队员的名字他竟不记得了(他的名字只好用"???"表示,年龄为0). (1)请你为``队员"这种对象定义一个类(队员信息的输出格式自定),使程序能编译通 过(不应通过修改main()函数来完成此要求).要求每个队员的姓名和年龄都是常量. in

c-一道离散数学编程题,求解答

问题描述 一道离散数学编程题,求解答 编程实现由偏序集合构造全序集合,最好能用C或C++编写,谢谢了 解决方案 你首先应该先解释一下什么是偏序集合,什么是全序集合,说清楚才有可能别人帮你! 解决方案二: 听上去说的文绉绉的,其实无非就是实现一个带排序的集合,再说得通俗一些,就是插入排序. 解决方案三: 直接把所有内容插入到set中,不就自动排序了吗?当然如果可以用库函数非要求必须自己编写.

一道c语言的题目,求解答

问题描述 一道c语言的题目,求解答 有函数原型为void f(int,int *);主函数中有变量定义:int a,*p=&a,b[10];则下列几种调用错误的是: A·f(a,p) B·f(*p,b) C·f(b,&a) D·f(*p,p) 我的想法是:子函数要接收一个整形变量,一个指针变量,那么B选项中b不是指针常量么? 求助大神们解答!谢谢! 答案是C 解决方案 C B中 b 是数组名,可以看作 const 的指针 C中第一个参数是b,但实际参数是 int 解决方案二: B 选项中的