求解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方法?? 展开
System.out.println(id);
// 定义一个map,从session中取出购物车对象
Map<Product, Integer> cart = (Map<Product, Integer>) request
.getSession().getAttribute("cart");
id是Product的一个属性 我想问下我这种定义map的方法为什么要根据Product里面的id去重写hashcode和equals方法?? 展开
展开全部
楼上说的还可以,不过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条,以获得更详尽的回答!
请采纳!
而如果你重载了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条
展开全部
hashMap是根据你写的hashCode这个方法生成哈希码来快速索引key值,某些HashMap的实现中,还用生成的哈希码来决定其存储位置。所以,作为key的对象必须重写hashCode方法,特别是自己建立的对象,如果用string来做key的话就不用了,因为String对象本来有已经重写了hashCode方法。
在HashMap中不能存在两个相等相同的key,这个相等用什么来判断呢?如果你没有重写equals方法,则不能判断两个key相不相等。所以还要重写equals方法。
你去看一下hashMap的实现方面的文章,应该会更清楚一些。
在HashMap中不能存在两个相等相同的key,这个相等用什么来判断呢?如果你没有重写equals方法,则不能判断两个key相不相等。所以还要重写equals方法。
你去看一下hashMap的实现方面的文章,应该会更清楚一些。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为了避免存放的数据或对象相同,也就是说为了避免重复数据
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询