Autoboxing è piuttosto spaventoso. Pur comprendendo pienamente la differenza tra ==
e .equals
non posso che aiutare hanno follow bug l'inferno fuori di me:Perché il compilatore/JVM non può semplicemente rendere automatico il boxing "funziona"?
final List<Integer> foo = Arrays.asList(1, 1000);
final List<Integer> bar = Arrays.asList(1, 1000);
System.out.println(foo.get(0) == bar.get(0));
System.out.println(foo.get(1) == bar.get(1));
che stampa
true
false
Perché l'hanno fatto in questo modo? Ha qualcosa a che fare con gli Interi memorizzati nella cache, ma se questo è il caso, perché non si limitano a memorizzare tutti gli Integi usati dal programma? O perché la JVM non si disattiva sempre automaticamente alla primitiva?
La stampa false false o true true sarebbe andata molto meglio.
EDIT
Non sono d'accordo per rottura del vecchio codice. Avendo restituito il valore foo.get(0) == bar.get(0)
, hai già infranto il codice.
non può risolvere il problema a livello di compilatore sostituendo numeri interi con int in bytecode (fintanto che non viene mai assegnato null)
funziona! non il modo in cui ti aspettavi, però;) – OscarRyz
In realtà il tuo esempio ha poco a che fare con l'autoboxing, questo comportamento lo precede. È vero che l'autoboxing ci costringe ad essere più consapevoli di esso: equals() è il modo (di solito corretto) di confrontare gli oggetti, == è il (solo) modo di confrontare le primitive ... autoboxing aiuta il programmatore a trattare Integer e int (quasi) in modo intercambiabile ... e quindi il pericolo di insetti qui. – leonbloy
Ciò può essere dovuto a particolarità che riguardano anche le stringhe. Per quanto comprendo le cose, c'è un po 'di condivisione che si svolge dietro le quinte in base al valore.Questo può essere evitato usando la parola chiave 'new'. –