求解java中重写hashcode和equals的问题

Stringid=request.getParameter("id");System.out.println(id);//定义一个map,从session中取出购物车对象... String id = request.getParameter("id");
System.out.println(id);

// 定义一个map,从session中取出购物车对象
Map<Product, Integer> cart = (Map<Product, Integer>) request
.getSession().getAttribute("cart");

id是Product的一个属性 我想问下我这种定义map的方法为什么要根据Product里面的id去重写hashcode和equals方法??
展开
 我来答
wuhao1542
2012-11-20 · TA获得超过175个赞
知道答主
回答量:90
采纳率:0%
帮助的人:106万
展开全部
楼上说的还可以,不过hashcode和equels的的重载并不是必要的!

而如果你重载了equels方法,则一定要重载hashcode方法,否则将会违反equels方法的第二条约定(相等的两个对象,散列值必然相等)。equels的三条约定请参阅《Effective Java》。

注:散列值(hashcode)相同的对象,不一定相等。

HashMap会将hashcode相同的键放在同一个散列桶中。意味着,若要在HashMap中查找一个键值,先会通过hashcode去快速达到某个散列桶,然后用equels方法逐个比较桶中的元素。直到找到该键值为止!

也就是说,有以下两种极端:
1.你定义的非常好,每个键对象都有不同的hashcode。那么Map的get方法,所花的期望时间是根号n的时间复杂度。十分快!
2.你定义所有的键对象都拥有同一个hashcode。(这并没有违反equels的约定,相等的对象,散列值相等!)此时,HashMap把所有的键对象放到同一个散列桶中,get方法的时间复杂度将会达到n平方。退化成了一个链表。

说的不对的地方请指正,也多包涵!
也可参见《Effective Java》 第8条,第9条,以获得更详尽的回答!

请采纳!

参考资料: Effective Java 第8条,第9条

zhaojiah0228
2012-11-19
知道答主
回答量:16
采纳率:0%
帮助的人:10万
展开全部
hashMap是根据你写的hashCode这个方法生成哈希码来快速索引key值,某些HashMap的实现中,还用生成的哈希码来决定其存储位置。所以,作为key的对象必须重写hashCode方法,特别是自己建立的对象,如果用string来做key的话就不用了,因为String对象本来有已经重写了hashCode方法。
在HashMap中不能存在两个相等相同的key,这个相等用什么来判断呢?如果你没有重写equals方法,则不能判断两个key相不相等。所以还要重写equals方法。
你去看一下hashMap的实现方面的文章,应该会更清楚一些。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友ce7f3ccb4
2012-11-20 · TA获得超过1950个赞
知道大有可为答主
回答量:2299
采纳率:0%
帮助的人:1880万
展开全部
为了避免存放的数据或对象相同,也就是说为了避免重复数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式