Java: la diferencia entre "equals ()" y "==" (versión completa detallada)

 

Tabla de contenido

Uno: el uso de "=="

Dos: el uso del método qeuals ()

Tres: Resumen de diferencias


A la vanguardia. Primero corrija un malentendido de pensamiento: el método equals () es más valioso.

El método equals () compara valores (esta afirmación es incorrecta)

Uno: el uso de "=="

1) Se puede utilizar en variables de tipo de datos básicos y variables de tipo de datos de referencia

2) Si la comparación es una variable de tipo de datos básico: la comparación es si los datos guardados por las dos variables son iguales. (No tiene que ser del mismo tipo)

     Si la comparación es una variable de tipo de datos de referencia: compare si los valores de dirección de los dos objetos son iguales, es decir, si las dos referencias apuntan a la misma entidad.

                                                           (Suplemento: en este momento, los tipos de variable en ambos lados de "==" deben ser los mismos)

Ejemplo de comparación de variables de tipo de datos básicos

        int i = 10;
        int j = 10;
        double d = 10.0;
        System.out.println(i == d); // true 因为存在类型提升,所以可以进行比较
        char ch = 10;
        System.out.println(ch == i); // true .
        // 注意上面返回的true,因为ch对应的值是10,而不是说'10',不然字符存储类1两位字符呀
        char c1 = 'A';
        char c2 = 65;
        System.out.println(c1== c2);   //true

Ejemplos de tipos de datos de referencia

public class Customer {
    public String name;
    private int age;

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class equals {
    public static void main(String[] args) {

        Customer cu1 = new Customer("Tom",11);
        Customer cu2 = new Customer("Tom",11);
        System.out.println(cu1 == cu2); // false
}

Atención especial: ejemplos de dos definiciones diferentes y métodos de inicialización de String

public class equals {
    public static void main(String[] args) {
        String s1 = "BB";
        String s2 = "BB";
        System.out.println(s1 == s2); // TRUE
        String s3 = new String("BB");
        String s4 = new String("BB");
        System.out.println(s3 == s4);  //FALSE
    }
}

Dos: el uso del método qeuals ()

1) equals () es un método, no un operador

2) el método equals () solo se puede aplicar a tipos de datos de referencia

3) La definición de equals () en la clase Object:

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

[Nota]: equals () en la clase Object sigue siendo el mismo que "==", la comparación sigue siendo la dirección del tipo de datos de referencia.

System.out.println(cu1.equals(cu2));  //flase

4) El anterior (3) es el método equals () en el Object más primitivo, pero el método equals () en la clase Object se reescribe como las clases String, Date, File y wrapper.

Vuelva a escribir la suma, la comparación no es si las dos direcciones referenciadas son iguales, sino si el "contenido de la entidad" de los dos objetos es igual, es decir, si los valores correspondientes son iguales.

        String str1 = new String("ye");
        String str2 = new String("ye");
        System.out.println(str1.equals(str2));// true

5) Normalmente, si nuestra clase personalizada usa equals (), generalmente compara si el "contenido de la entidad" (valor) de dos objetos es igual.

Pero nuestra clase personalizada corresponde al método equals () en Object, por lo que necesitamos reescribir equals () en la clase Object.

El principio de reescritura: compare si el contenido de la entidad de dos objetos es el mismo.

Podemos escribir a mano o generarlo automáticamente a través del editor. A continuación se muestra el método equals () reescrito que escribimos manualmente.

public class Customer {
    public String name;
    private int age;

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }

        if(obj instanceof  Customer){
            Customer cust = (Customer) obj;
            //比较·两个对象的每个属性是否都相同
            if (this.age == cust.age && this.name.equals(cust.name)){
                // int类型的age使用==比较,String类型的name使用equals比较
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }
}

Tres: Resumen de diferencias

Supongo que te gusta

Origin blog.csdn.net/yezonghui/article/details/112516387
Recomendado
Clasificación