本帖最后由 黑马龙子 于 2013-8-7 17:01 编辑
用的是equals(Object obj)和hashcode()这两个方法进行比较的,equals(Object obj)方法用来判定两个对象是否“相同”,假如“相同”则返回true,否则返回false。hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。- class A {
- @Override
- public boolean equals(Object obj) {
- System.out.println("判定equals");
- return false;
- }
- @Override
- public int hashCode() {
- System.out.println("判定hashcode");
- return 1;
- }
- }
- public class Test {
- public static void main(String[] args) {
- Map<A,Object> map = new HashMap<A, Object>();
- map.put(new A(), new Object());
- map.put(new A(), new Object());
-
- System.out.println(map.size());
- }
- }
复制代码 运行之后打印结果是:- 判定hashcode
- 判定hashcode
- 判定equals
- 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()这两个方法进行比较的。
希望可以帮助你理解!
|