== 与 equals

69 阅读2分钟

==

  • == 比较基本数据类型时,比较的是他们的值是否相同。
  • 比较引用数据类型则会比较所指向对象的地址是否相同。
public static void main(String[] args) {
    int i1 = 22;
    int i2 = 22;
    System.out.println(i1 == i2);//true

    Integer in1 = 356;
    Integer in2 = 356;
    System.out.println(in1 == in2);//false

    /**
     * 因为常量池对于-128到127之间的数进行了缓存,Integer in3 = 127时会放入缓存,
     * 当Integer in4 = 127时则直接会从缓存当中直接获取,就不会new了,因此地址值相同,所以为true。
     */
    Integer in3 = 127;
    Integer in4 = 127;
    System.out.println(i1 == i2);//true

    int i = 13;
    Integer in = 13;
    System.out.println(i == in);//true 因为Integer与int比较时,Ingeger都会自动拆箱。

    Integer i5 = new Integer(12);
    Integer i6 = new Integer(12);
    System.out.println(i5 == i6);//false 对象不同。
} 

equals

  • equals不可以用来比较基本数据类型

Object类中的equals

实质上还是使用的是 == 进行比较。

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

String类中的equalsS

String类对Object类当中的equals方法进行了重写,因此,该方法才具备了比较String内容的功能,而不是去比较内存地址值是否相同。

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方法进行自己需要的规则进行重写后才会比较内容是否相同。
  • equals不能比较基本数据类型。