黑马程序员技术交流社区

标题: 集合排序问题 [打印本页]

作者: 罗广伟    时间: 2013-8-7 10:09
标题: 集合排序问题
本帖最后由 杨兴庭 于 2013-8-7 17:48 编辑

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

作者: 薛淑凯    时间: 2013-8-7 10:19
hashCode和equals
作者: 哪颗最亮的星星    时间: 2013-8-7 10:21
HashSet 和HashMap会调用底层的hashCode()和equal()来对元素进行比较,来保证在集合里的唯一性。
作者: 罗广伟    时间: 2013-8-7 11:30
哪颗最亮的星星 发表于 2013-8-7 10:21
HashSet 和HashMap会调用底层的hashCode()和equal()来对元素进行比较,来保证在集合里的唯一性。 ...

hashcode和equals不是比较是否相同吗?
作者: 罗广伟    时间: 2013-8-7 11:30
薛淑凯 发表于 2013-8-7 10:19
hashCode和equals

hashcode和equals不是比较是否相同吗?
作者: 薛淑凯    时间: 2013-8-7 14:14
罗广伟 发表于 2013-8-7 11:30
hashcode和equals不是比较是否相同吗?

比较完根据hashCode确定位置啊
作者: 黑马龙子    时间: 2013-8-7 16:56
本帖最后由 黑马龙子 于 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()这两个方法进行比较的
希望可以帮助你理解!








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2