La condizione in
pay[0]==point[0]
espressione, utilizza l'operatore uguaglianza == per confrontare un riferimento
Integer pay[0]
per uguaglianza con il riferimento
Integer point[0]
In generale, quando i valori di tipo primitivo (come int, ...) sono confrontati con ==, il risultato è vero se entrambi i valori sono identici. Quando i riferimenti (come Integer, String, ...) vengono confrontati con ==, il risultato è true se entrambi i riferimenti si riferiscono allo stesso oggetto in memoria. Per confrontare i contenuti effettivi (o le informazioni sullo stato) degli oggetti per l'uguaglianza, è necessario richiamare un metodo. Così, con questo
Integer[] point = new Integer[2];
espressione si crea un nuovo oggetto che ha avuto nuovo riferimento e assegnarlo a punto variabile.
Ad esempio:
int a = 1;
int b = 1;
Integer c = 1;
Integer d = 1;
Integer e = new Integer(1);
per confrontare una con l'uso b:
a == b
perché entrambi sono valori primitivi tipo.
per confrontare una con l'uso c:
a == c
a causa della funzione di auto-boxing.
per confrontare c con e uso:
c.equals(e)
a causa della nuova referenza in e variabile.
per confrontare c con d è migliore e sicuro da usare:
c.equals(d)
a causa di:
Come sapete, l'operatore ==, applicato in oggetti wrapper, solo verifica se gli oggetti hanno posizioni di memoria identiche. Il seguente confronto sarebbe quindi probabilmente fallirà:
Integer a = 1000;
Integer b = 1000;
if (a == b) . . .
Tuttavia, un'implementazione Java può, se lo desidera, avvolgere i valori che si verificano comunemente in oggetti identici, e quindi il confronto potrebbe avere successo. Questa ambiguità non è ciò che vuoi. Il rimedio è chiamare il metodo equals quando si confrontano gli oggetti wrapper.
se hai una mente aperta, allora si può come la mia spiegazione ... È perché i creatori di Java regalmente avvitato su quando hanno deciso di fare le classi wrapper, che hanno prestazioni veramente patetico (non hai idea dello spreco generato dal wrapping di un * int * all'interno di un * Integer *). Lo hanno fatto principalmente perché non erano in grado di progettare qualcosa di pulito ed efficiente come, ad esempio, * Trove * 's * TLongIntHashMap *. Naturalmente aspettatevi commenti da parte di persone che hanno bevuto il raffreddatore Java spiegando come ho sbagliato e come le classi wrapper sono una manna dal cielo;) – SyntaxT3rr0r
btw, mai e poi mai fare un * nuovo Integer [2] * perché forzate il creazione di un nuovo oggetto. ** IFF ** continui a utilizzare classi wrapper come * Integer * (che in realtà non dovresti ma è un altro argomento), vuoi fare un * Integer.valueOf (2) * (btw che successivamente ** garantisce ** secondo le specifiche Java, il riutilizzo dei primi 256 oggetti interi da -128 a 127, ma non è un brainfart Java molto noto). – SyntaxT3rr0r
SpoonBender: Che dire della decisione dei creatori di Java di * solo * consentire l'overloading dell'operatore per le stringhe? In questo modo 'Integer.valueOf (127) == Integer.valueOf (127)' but 'Integer.valueOf (128)! = Integer.valueOf (128)'! – Gabe