727 votes

Java == vs equals() de la confusion

Je tenais à préciser que si je comprends bien:

  • == -> est une référence de comparaison, c'est à dire à la fois des objets pointent vers le même emplacement de mémoire
  • .equals() -> correspond à la comparaison des valeurs dans les objets

Ai-je raison de ma compréhension ?

705voto

Hovercraft Full Of Eels Points 161146

En général, la réponse à votre question est "oui", mais...

  • il est .equals(...) (la première lettre est en majuscule pas).
  • équivaut à ne comparer ce qu'il est écrit pour comparer, pas plus, pas moins.
  • si equals n'est pas remplacé, il prend par défaut la Object#equals(Object o) méthode. Par l'Objet de l'API est la même que ==; en effet, elle renvoie true si et seulement si les deux variables font référence au même objet, si leurs références sont un et le même.
  • Rappelez-vous de toujours remplacer hashCode si vous substituez equals afin de ne pas "casser le contrat".

125voto

À l'égard de la classe String:

La equals() la méthode compare la "valeur" à l'intérieur des instances de Chaîne (sur le tas) que si les deux(2) références de l'objet reportez-vous à la même instance de Chaîne ou pas. Si deux(2) références de l'objet de type String, reportez-vous à la même instance de Chaîne, puis une grande! Si les deux(2) références de l'objet se référer à deux(2) différentes instances de Chaîne .. il ne fait pas de différence. Sa "valeur" (ce qui est: le contenu du tableau de caractères) à l'intérieur de chaque instance de Chaîne qui est comparé.

D'autre part, le "==" opérateur compare la valeur de l' objet de deux références pour voir si elles se réfèrent à la même instance de Chaîne. Si la valeur des deux références de l'objet "voir" la même instance de Chaîne, le résultat de l'expression booléenne serait "vrai"..duh. Si, d'autre part, la valeur des deux références de l'objet "voir" les différentes instances de Chaîne (même si les deux instances de Chaîne ont les mêmes "valeurs", qui est, le contenu des tableaux de caractères de chaque instance de Chaîne sont les mêmes), le résultat de l'expression booléenne serait "faux".

Comme avec n'importe quelle explication, le laisser pénétrer.

J'espère que cela efface un peu les choses.

71voto

Almir Campos Points 121

Il y a quelques petites différences selon que l'on parle de "primitives" ou "Types d'Objet"; la même chose peut être dit que si vous parlez de la "statique" ou "non-statique" membres; vous pouvez également mélanger tous les ci-dessus...

Voici un exemple (vous pouvez l'exécuter):

public final class MyEqualityTest
{
    public static void main( String args[] )
    {
        String s1 = new String( "Test" );
        String s2 = new String( "Test" );

        System.out.println( "\n1 - PRIMITIVES ");
        System.out.println( s1 == s2 ); // false
        System.out.println( s1.equals( s2 )); // true

        A a1 = new A();
        A a2 = new A();

        System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
        System.out.println( a1 == a2 ); // false
        System.out.println( a1.s == a2.s ); // true
        System.out.println( a1.s.equals( a2.s ) ); // true

        B b1 = new B();
        B b2 = new B();

        System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
        System.out.println( b1 == b2 ); // false
        System.out.println( b1.getS() == b2.getS() ); // false
        System.out.println( b1.getS().equals( b2.getS() ) ); // true
    }
}

final class A
{
    // static
    public static String s;
    A()
    {
        this.s = new String( "aTest" );
    }
}

final class B
{
    private String s;
    B()
    {
        this.s = new String( "aTest" );
    }

    public String getS()
    {
        return s;
    }

}

Vous pouvez comparer les explications de "==" (Opérateur d'Égalité) et ".est égal à(...)" (méthode en java.lang.La classe d'objet) par le biais de ces liens:

15voto

Andrew Carr Points 461

Vous aurez à remplacer la est égale à la fonction (avec d'autres) pour l'utiliser avec des classes personnalisées.

La méthode equals compare les objets.

L' == opérateur binaire compare mem adresses.

8voto

tintin Points 925

Les deux == et .equals() fait référence à l'objet même si vous ne la supplante pas .equals().

Son votre souhait que vous voulez faire une fois que vous remplacez .equals(). Vous pouvez comparer l'invocation de l'objet d'état avec le passé dans l'objet de l'état ou vous pouvez les appeler super.equals()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X