[update] Utilizzando new Integer(int)
è garantito per portare sempre in un nuovo oggetto, mentre Integer.valueOf(int)
consente la memorizzazione nella cache di valori deve essere fatto dal compilatore, libreria di classi, o JVM.
Per spiegare che ho scritto sotto il codice e utilizzato lo strumento javap
, comando per generare sotto il codice Ho usato javap -c <Classname>
che ti dà il codice byte.
Integer x = new Integer(0), y;
y=x;
x+=0;
System.out.println(x==y); // prints false

Se si vedrà nel codice sopra di esso crea nuovo oggetto con allocatore di memoria dinamica che è new
. Ora nel secondo caso come sotto:
Integer x = 0, y;
y=x;
x+=0;
System.out.println(x==y); // prints true

Come detto da Peter utilizza valueOf
metodo che significa che è confrontare stesso oggetto in fase di esecuzione in modo che ritorni true
con operatore confronto oggetti (==
). Ma nel primo caso si stava creando nuovo oggetto che è evidente in seguito snapshot debug:

Spero che questo aiuta. :)
A proposito, la risposta di Kevin Esche aggiunge anche alla domanda. Poiché si riferisce fondamentalmente all'oggetto memorizzato nella cache, provare a correlarlo in caso di String
. Se si utilizza new String("some_string")
, verrà creato un nuovo oggetto diverso se disponibile che utilizzerà da string pool
. E ricorda che stai usando classi wrapper non primitive.
no, perché "Intero" nell'intervallo di -128 - 127' viene memorizzato nella cache. Nel tuo primo esempio si crea in modo esplicito un nuovo 'Integer', nonostante il fatto che ogni' Integer' nell'intervallo di '-128 - 127' si riferisca allo stesso oggetto. – SomeJavaGuy
Nonostante ciò che altre risposte dicono -128 - 127 non è dogma, è solo una funzionalità di JVM, che può essere ottimizzata su alcune versioni con la proprietà '-Djava.lang.Integer.IntegerCache.high', ei valori predefiniti possono differire notevolmente da Da JVM a JVM, ** Non dovresti mai fare affidamento su questo comportamento! ** Vedi http: // StackOverflow.it/questions/15052216/how-large-is-the-integer-cache –