首页 > 技术文章 > Java中==、equals、hashCode的区别

siubing 2020-10-12 08:01 原文

"=="是运算符,用来比较两个值、两个对象的内存地址是否相等;
"equals"是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过"=="来实现的;如果想比较两个对象的其他内容,则可以通过重写equals方法。
"hashCoed"也是Object类里面的方法,返回值是一个对象的哈希码,同一个对象哈希码一定相等,但不同对象哈希码也有可能相等。
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。

示例:

通过"=="比较两个值
String a1 = "aa";
String a2 = "aa";
System.out.println(a1 == a2); //true

通过"=="比较两对象的内存地址【获取内存地址System.identityHashCode('*')】
String china1 = new String("中国"); //1313922862
String china2 = new String("中国"); //495053715
System.out.println(china1 == china2); //false

String源码中equals内部实现:

public boolean equals(Object anObject) {
   if (this == anObject) { //比较两个对象的地址
      return true;
   }
   if (anObject instanceof String) { //判断该对象是否是String类型
      String anotherString = (String)anObject;
      int n = value.length;
      if (n == anotherString.value.length) { //比较两个字符串的长度是否相等
         char v1[] = value;
         char v2[] = anotherString.value;
         int i = 0;
         while (n-- != 0) {
            if (v1[i] != v2[i]) //比较两个字符串中的每一个字符是否相等
               return false;
            i++;
         }
         return true;
      }
   }
   return false;
}

当两个对象不equals,他们的hashcode有可能相等,以下示例:

System.out.println("AaAa".hashCode()); //2031744
System.out.println("BBBB".hashCode()); //2031744

推荐阅读