A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗广伟 中级黑马   /  2013-8-7 10:09  /  1333 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-7 17:48 编辑

在集合中,TreeSet和TreeMap可以通过comparable或者comparator进行比较。ArrayList可以通过Collections的sort方法进行比较,那么HashSet和HashMap怎么对元素进行比较呢?

评分

参与人数 1黑马币 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
hashCode和equals
回复 使用道具 举报
HashSet 和HashMap会调用底层的hashCode()和equal()来对元素进行比较,来保证在集合里的唯一性。
回复 使用道具 举报
哪颗最亮的星星 发表于 2013-8-7 10:21
HashSet 和HashMap会调用底层的hashCode()和equal()来对元素进行比较,来保证在集合里的唯一性。 ...

hashcode和equals不是比较是否相同吗?
回复 使用道具 举报

hashcode和equals不是比较是否相同吗?
回复 使用道具 举报
罗广伟 发表于 2013-8-7 11:30
hashcode和equals不是比较是否相同吗?

比较完根据hashCode确定位置啊
回复 使用道具 举报
本帖最后由 黑马龙子 于 2013-8-7 17:01 编辑

用的是equals(Object obj)hashcode()这两个方法进行比较的,equals(Object obj)方法用来判定两个对象是否相同,假如相同则返回true,否则返回falsehashcode()方法返回一个int数,在Object类中的默认实现是将该对象的内部地址转换成一个整数返回
  1. class A {
  2.         @Override
  3.         public boolean equals(Object obj) {
  4.                 System.out.println("判定equals");
  5.                 return false;
  6.         }
  7.         @Override
  8.         public int hashCode() {
  9.                 System.out.println("判定hashcode");
  10.                 return 1;
  11.         }
  12. }
  13. public class Test {
  14.         public static void main(String[] args) {
  15.                 Map<A,Object> map = new HashMap<A, Object>();
  16.                 map.put(new A(), new Object());
  17.                 map.put(new A(), new Object());
  18.                
  19.                 System.out.println(map.size());
  20.         }
  21. }
复制代码
运行之后打印结果是:
  1.     判定hashcode
  2.     判定hashcode
  3.     判定equals
  4.     2
复制代码
运行时环境会调用new A()这个对象的hashcode()方法。其中:第一行“判定hashcode”是第一次map.put(new A(), new Object())所打印出的。接下来的“判定hashcode”和“判定equals”是第二次map.put(new A(), new Object())所打印出来的。
1、在第一次map.put(new A(), new Object())的时候,运行时环境就会判定这个map里面有没有和现在添加的 new A()对象相同的键,判定方法:调用new A()对象的hashcode()方法,判定map中当前是不是存在和new A()对象相同的HashCode。显然,这时候没有相同的,由于这个map中都还没有东西。所以这时候hashcode不相等,则没有必要再调用equals(Object obj)方法了。参见推论4(假如两个对象hashcode不相等,他们一定不equals)
  2、在第二次map.put(new A(), new Object())的时候,运行时环境再次判定,这时候发现了map中有两个相同的hashcode(由于我重写了A类的hashcode()方法永远都返回1),所以有必要调用equals(Object obj)方法进行判定了。
也就是说HashSet 和HashMap会调用底层的hashCode()和equal()来对元素进行比较,从而来保证在集合里的唯一性。致使HashSet 和HashMap的比较用的是equals(Object obj)和hashcode()这两个方法进行比较的
希望可以帮助你理解!



评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马