== 和 equals 的区别是什么?

2019-09-15  

使用 == 比较

  • Java 中的 8 种基本数据类型(byte,short,char,int,long,float,double,boolean)比较他们之间的值是否相等。

  • 引用数据类型,比较的是他们在堆内存地址是否相等。每新 new 一个引用类型的对象,会重新分配堆内存空间,使用 == 比较返回 false。

 

使用 equals() 比较

equals() 方法是 Object 类的一个方法,Java 当中所有的类都是继承于 Object 这个超类。
JDK1.8 Object 类 equals() 方法源码如下,即返回结果取决于两个对象的使用 == 判断结果。

public boolean equals(Object obj) {
    return (this == obj);
}


在实际使用中,一般会重写 equals 方法,如 JDK1.8 java.lang.String 类的 equals() 源码如下。
即两个字符串使用 == 相等  或者  两个字符串的所有组成字符都相等返回 true,其他情况返回 false 。String 类根据 equals() 方法判断是否相等的逻辑。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof 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() 的作用:
  引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的 equals() 方法(重写 equals() 方法,一般须重写 hashCode() 方法)。

 

PS:可以延伸自己写代码比较一个基本类型的包装类对象使用 == 和 equals() 进行比较的结果,会涉及到 JVM 对部分基本类型的常用值的缓存。

 

ConstXiong 备案号:苏ICP备16009629号-3