Cosa significa la parola "uguale" in Java API?


Non sono sicuro che qualcuno conosca la risposta a questa domanda, a meno che tu non sia responsabile della scrittura dell'API Jave, ma quando l'API Java dice "uguale", significa sempre che a.equals(b) valuta true, o qualche volta significa a == b è true? Recentemente ho esteso una classe e mi sono chiesto se avessi bisogno di sovrascrivere un metodo a seconda di dove o meno ha usato == o .equals. In particolare, ho esteso javafx.fagiolo.vincolante.ObjectExpression ed era curioso del metodo .isEqualTo(Object other). Mi controllato l'origine ( qui ) e trovato che questo metodo utilizza .equals per il confronto. Sono curioso di sapere se posso essere sicuro che quando leggo cose come

"Crea una nuova BooleanExpression che vale true se questa ObjectExpression è uguale a un valore costante."

Che il metodo non utilizza l'operatore ==. Anche se, come penso, l'API non può significare .equals, poiché (ad esempio)

String constant = "constant";
ObjectExpress<String> stringExpression = new MyStringExpression("constant");

constant.equals(stringExpression)

Sarà sempre restituisce false. Cosi forse la mia domanda dovrebbe essere "quando l'API dice 'equals', si riferisce sempre al modo più ragionevole di applicare .equal o qualche volta si riferisce al modo analogo di applicare ==?"

MODIFICA

Penso che in base alle risposte dovrei chiarire: questa è non una domanda sulla differenza tra == e .equal. Si tratta di cui l'API Java si riferisce quando usa la parola inglese "equals".

Author: Mogsdad, 2014-02-25

5 answers

È chiaro che tu fai capire la differenza tra equals() e ==. Quindi la tua domanda è piuttosto filosofica:)

Generalmente, molte API usano "equals to" nel significato di equals() e "is the same as" nel significato di ==. Ad esempio JUnit ha il metodo di asserzione assertEquals() e assertSame().

Tuttavia, usa il tuo buon senso e analizza il linguaggio della doucmentazione. Si noti nella frase citata dall'API l'utilizzo dell'articolo indefinito:

"Crea un nuova BooleanExpression che vale se questo ObjectExpression è uguale a un valore costante ."

"un valore costante " indica chiaramente qualsiasi valore costante, non lo stesso valore di "constant" valore. Quindi è chiaro che questo non può significare lo stesso di constant.equals(stringExpression).

Quindi prendilo in questo modo: quando la documentazione dice "è uguale a", prendi che si riferisce al contenuto della variabile, non al suo riferimento. Ma usa buon senso e leggere la frase nel suo complesso:)

Risponde alla tua domanda? : P

 2
Author: Honza Zidek, 2014-02-25 09:12:36

Significa sempre che a. equals (b) valuta true, o qualche volta significa che a = = b è vero? quando l'API dice 'equals', si riferisce sempre al massimo modo ragionevole per applicare .uguale o qualche volta si riferisce al modo analogo per applicare ==?"

Si tratta di sovrascrivere il metodo equals(), in java, solo += operatore sovraccarico, altri operatori non possono essere sovraccaricati significa, non è possibile sovrascrivere ==

 1
Author: Abimaran Kugathasan, 2014-02-25 08:51:05

Quando si scrive un API-doc quando si utilizza il termine "uguale" questo di solito dovrebbe significare "uguale in termini di equals()-metodo". Se lo fa davvero dipende dalla completezza dello scrittore della documentazione, ma nei documenti API ufficiali prenderei sempre questo significato.

Per la tua domanda "può anche significare ==": può nel modo in cui il metodo Object equals() controlla solo l'identità di riferimento, cioè controlla usando ==.

 1
Author: piet.t, 2014-02-25 08:58:48

Se si utilizza .equals verrà confrontato il valore. Usando == stai confrontando il riferimento e questi non devono essere gli stessi anche se i tuoi valori sono gli stessi.

Vedere il seguente sito web per una spiegazione completa: http://www.javabeat.net/what-is-difference-between-equals-and /

Ho copiato una parte del suo esempio:

s1 = new String("abc");
s2 = new String("abc");

Ora, se si utilizza il metodo equals() per verificare la loro equivalenza come

if(s1.equals(s2))
     System.out.println("s1.equals(s2) is TRUE");
else
     System.out.println("s1.equals(s2) is FALSE");

Si otterrà l'output come TRUE come il metodo equals() controlla l'uguaglianza del contenuto. Consente di controllare l'operatore ==..

if(s1==s2)
     System.out.printlln("s1==s2 is TRUE");
   else
     System.out.println("s1==s2 is FALSE");

Ora otterrai l'output FALSE as perché sia s1 che s2 puntano a due oggetti diversi anche se entrambi condividono lo stesso contenuto della stringa. È a causa di new String() ogni volta che viene creato un nuovo oggetto.

 0
Author: GuyT, 2014-02-25 09:01:01

Quando qualcuno crea una classe java eredita il metodo boolean equals(Object o) dalla classe 'Object', poiché tutta la classe definita dall'utente quando non estende nessun'altra classe estende class Object implicitamente.

Quando questa classe viene istanziata usando l'operatore new l'uguaglianza di questi oggetti viene raggiunta usando questa formula di sottolineatura.

    return (this == obj);

Quindi restituirà true se e solo se entrambi gli oggetti si riferiscono allo stesso oggetto sull'heap cioè (a = = b) = true

    class Abc{}
    Abc a = new Abc();
    Abc b = a;
    a==b //(true)
    a.equals(b) //(true)

E supponiamo che siano istanza di stessa classe ma sono due oggetti diversi da

   class Abc{}
   Abc a = new Abc();
   Abc b = new Abc();
   a==b; //(false)
   a.equals(b); //(false)

Ma quando una classe creata sovrascrive questo metodo uguale, questa uguaglianza viene valutata utilizzando la nuova formula fornita durante l'override. Biru .è uguale a override oggetto da java.util.Data

    public boolean equals(Object obj) {
            return obj instanceof Date && getTime() == ((Date) obj).getTime();
     }

Questo restituirà true se e solo entrambi gli oggetti Date hanno lo stesso valore restituito dal metodo getTime ().

Spero che questo aiuti. Sentitevi liberi di porre ulteriori domande in caso di dubbio.

 0
Author: Jafar Ali, 2014-02-25 09:21:57