PDA

Visualizza versione completa : Integer Java (SE 1.5 e 1.6) - anomalia (o no?)


shadowDK
03-04-2008, 11.24.58
Ciao a tutti...questo è un comportamento forse anomalo di queste due versioni di Java (fino alla 1.4 credo che un assegnamento del genere generasse un compile error)

public class Prova{
public static void main(String[] args){
Integer a1=128;
Integer a2=128;
/*1*/System.out.println(a1==a2);
/*2*/System.out.println(a1);
/*3*/System.out.println(a2);
}}

/*1*/ stampa true se a1 e a2 sono entrambi inizializzati a valori compresi tra -128 e 127 (caso strano, 256 valori, quelli ottenibili da un byte) false per valori esterni, ossia per valori minori di -128 e maggiori di 127...

qualcuno ha qualche idea della motivazione?

in aggiunta, dico che /*2*/ e /*3*/ stampano SEMPRE il valore inserito in dichiarazione, qualunque esso sia...

grazie!

Cacciavite
06-04-2008, 12.36.45
Mi sa devi usare l'operatore equals().
Cito dal mio libro:

Integer i1 = new Integer(12);
Integer i2 = new Integer(12);

Il test i1==i2 darà esito false, in quanto le due variabili fanno riferimento a due oggetti distinti; al contrario, l'espressione i1.equals(i2) risulterà vera, dal momento che i due oggetti hanno lo stesso identico stato.
L'operatore == permette di verificare l'identità tra due refernece, che si verifica nel caso in cui essi facciano riferimento allo stesso oggetto in memoria.

Poi non so... è da poco che uso Java, ma credo sia così.

shadowDK
07-04-2008, 09.50.26
Visto che ti sei interessato ti dò la risposta tecnica precisa (più omeno, su alcune cose non mi sono informato ancora con estrema precisione)...avviso però che è abbastanza lunga...
allora, il confronto == tra gli oggetti confronta i puntatori...ossia, due oggetti risultano uguali con queste ocnfronto se e solo se puntano alla stessa area di memoria.. il confronto con equals, invece, confronta il valore (è il confronto di uguaglianza inteso nel senso utente)...
ora, cosa succede quando io scrivo una dichiarazione del tipo Integer i = 100? ecco, viene attivata una "java integer cache" (che ancora non so di preciso cos'è) che dovrebbe essere grande 1 byte...in pratica, avvengono quindi due comportamenti diversi:

per i numeri compresi nell'intervallo -128;127 estremi inclusi sono memorizzati in tale cache, pertanto a valore uguale corrisponde cella di memoria uguale e quindi anche il confronto == "funziona" nel senso utente;
per valori esterni a questo intervallo (non inseriti nella cache) il confronto == funziona invece nel modo classico per gli oggetti, e quindi il risultato del confronto non è determinabile a priori (può benissimo succedere che a valore uguale corrisponda cella di memoria uguale, ma non è assolutamente la regola,anzi il 99,9% delle volte non succede)

Comunque, come dice il tuo libro, tra oggetti NON è mai opportuno usare il confronto ==...si DEVE usare sempre usare l'equals! La mia era solo una curiosità!
Altra nota: l'inizializzazione Oggetto o = valore; restituisce spesso un errore in fase di compilazione, è ammessa (credo) solo per i valori numerici (Integer, Real, Double ecc) e per le stringhe (String)...

Cacciavite
07-04-2008, 11.16.12
Ok, buono a sapersi.
Sto Java è più ingarbugliato di non so che...