2011-12-05 6 views
5

Hey, al momento sto studiando per un java final e sono confuso da un semplice metodo equals.Come funziona lo stesso metodo di un array?

La domanda dato è

"Dati i seguenti dichiarazioni di matrice, che cosa fa la seguente stampa"

e ho pensato che sarebbe stato vero, falso, vero, però dopo copiando e incollando il il codice rivela che la risposta è falsa, falsa, vera.

Capisco che il == funzioni solo quando sono la stessa istanza dell'oggetto ma non capisco perché il primo su è falso. Ho provato a trovare il metodo nell'API dell'array ma non sono riuscito a trovarne uno con gli stessi argomenti.

Perdonami se è ovvio, sono stato alzato fino a tardi nelle ultime notti trascorse a studiare e sono abbastanza stanco di caffeina al momento.

int[] d = { 1, 2, 3 }; 
int[] b = { 1, 2, 3 }; 
int[] c = d; 
System.out.println(d.equals(b)); 
System.out.println(d == b); 
System.out.println(d == c); 

risposta

16

Fondamentalmente, tipi di matrice non hanno la precedenza equals fornire parità valore ... così si finisce con l'implementazione predefinita in oggetto, che è uguaglianza riferimento.

Per l'uguaglianza dei valori in matrici (ad esempio elementi uguali nello stesso ordine), utilizzare i metodi statici nella classe Arrays.

+1

+1 per fornire suggerimenti su come ottenere l'uguaglianza sequenza/valore (e non perché tu sia Jon Skeet). –

+1

E solo per completare il pensiero, ci sono diversi sovraccarichi di 'Arrays.equals', come pure un' Array.deepEquals (Object, Object) ', che può darti un'uguaglianza più" naturale ". – yshavit

+0

L'oggetto ha un metodo uguale ... Sapevo che non potevo pensare, ora lo capisco dopo un pisolino. Grazie mille per avermi aiutato a capire !! – Erik

3

Gli array Java normali (ovvero non ArrayList o alcuni di essi) non implementano, a loro volta, equals, ma utilizzano l'implementazione in Object. Questo è fondamentalmente solo un confronto di indirizzi.

(ma si noti che java.util.Arrays implementa alcune equals metodi statici per array generici.)

1

Un array è un oggetto e non sovrascrive Object.equalsQ(), quindi l'implementazione standard dell'oggetto .equals() si applica. array.equals(something) è vero se e solo se array == something.

1

Le matrici implicano la classe Object implicitamente. Quindi, il tuo metodo equals viene ereditato da lì. L'implementazione predefinita del metodo equals controlla solo l'uguaglianza dell'identità, vale a dire lo stesso di ==.

1

È corretto che l'operatore == confronti solo per l'uguaglianza di riferimento, quindi la seconda e la terza dichiarazione di stampa fanno ciò che ci si aspetta.

Il metodo .equals può essere confrontato con altri mezzi rispetto all'uguaglianza di riferimento, ma richiede la definizione della classe per implementare effettivamente tale metodo. Se .equals non è implementato nella classe array, il runtime ricadrà su Object#equals, che è la stessa uguaglianza di riferimento che si trova con l'operatore ==.

In altre parole, sembra che non ci sia il metodo .equals nella classe di supporto per gli array o che sia implementato in modo diverso rispetto al confronto elemento per elemento.

Problemi correlati