zoukankan      html  css  js  c++  java
  • Java之equals和hashCode方法

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。 那么Java虚拟机是如何判断HashSet中相同对象、HashMap中相同键的呢?

    首先说明一下JDK对equals(Object obj)和hashcode()这两个方法的定义和规范: 在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是"将该对象的内部地址转换成一个整数返回"。

    规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。
    规范2:如果equals(Object obj)返回false,即两个对象"不相同",并不要求对这两个对象调用hashcode()方法得到两个不相同的数。

    根据这两个规范,可以得到如下推论:
    1、如果两个对象equals,Java虚拟机会认为他们的hashcode一定相等。
    2、如果两个对象不equals,他们的hashcode有可能相等。
    3、如果两个对象hashcode相等,他们不一定equals。
    4、如果两个对象hashcode不相等,他们一定不equals。

    代码测试

    public class Father {
    	
    	public String name;
    	
    	public int age;
    	
    	public Father(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	
        @Override   
        public boolean equals(Object obj) {   
            System.out.println("判断equals");   
            return true;   
        }   
       
        @Override   
        public int hashCode() {   
            System.out.println("判断hashcode");   
            return 1;   
        }
    }
    
    

    测试类

    public class Test {
    	public static void main(String[] args) {
    		Map<Father,Object> map = new HashMap<Father, Object>();   
            map.put(new Father("fei", 23), new Object());   
            map.put(new Father("qiang", 22), new Object());
            System.out.println(map.size());
    	}
    }
    

    结果:
    判断hashcode
    判断hashcode
    判断equals
    1

    分析上面结果

    当第一次map.put()的时候,Java虚拟机就会判断这个map里面有没有和现在添加的Object对象相同的键,判断方法:调用Father对象的hashcode()方法,判断map中当前是不是存在和Father对象相同的HashCode。显然,这时候没有相同的,因为这个map中都还没有东西。

    当第二次map.put()的时候,Java虚拟机再次判断,这时候发现了map中有两个相同的hashcode(法永远都返回1),所以有必要调用equals(Object obj)方法进行判断了。因为equeal永远返回true,所以Java虚拟机认为这是两个相同的对象,或者说是键,所以map的size为1,键相同,值替换。

    费哥总结

    在Java规范下:
    equals方法返回值true,那么hashCode方法返回的int值一定相等。
    hashCode方法返回的int值不相等,equals方法返回值一定为false。

  • 相关阅读:
    linux压缩命令
    常用正则表达式
    java23种设计模式
    程序员
    让程序猿离职的非钱原因
    PHP MVC 中的MODEL层
    CSS样式补充代码
    网页中插入背景音乐
    Window.document对象(2)
    Window.document对象(1)
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/11106792.html
Copyright © 2011-2022 走看看