No Java efetivo de Joshua Bloch , item 5: "Evite criar objetos desnecessários", ele publica o seguinte exemplo de código:
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
e leva 43 segundos para ser executado. Levar o Long até o primitivo reduz para 6,8 segundos ... Se isso é alguma indicação de por que usamos primitivos.
A falta de igualdade de valor nativo também é uma preocupação ( .equals()
é bastante detalhada em comparação com ==
)
para biziclop:
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
Resulta em:
false
false
true
false
EDITAR Por que (3) retorna true
e (4) retorna false
?
Porque eles são dois objetos diferentes. Os 256 números inteiros mais próximos de zero [-128; 127] são armazenados em cache pela JVM, portanto, eles retornam o mesmo objeto para eles. Além desse intervalo, porém, eles não são armazenados em cache, portanto, um novo objeto é criado. Para tornar as coisas mais complicadas, o JLS exige que pelo menos 256 flyweights sejam armazenados em cache. Os implementadores da JVM podem adicionar mais, se desejarem, o que significa que isso pode ser executado em um sistema em que os 1024 mais próximos são armazenados em cache e todos eles retornam verdadeiros ... #awkward