Comparando Objetos Wrappers

//Cenário 1
Integer i1 = 100;
Integer i2 = 100;

if(i1 == i2)System.out.println("True");

//Cenário 2
Integer j1 = new Integer(100);
Integer j2 = new Integer(100);

if(j1 == j2)System.out.println("True");

Porque no Cenário 1 ele compara o valor primitivo e no Cenário 2 ele compara a referência do objeto? No Cenário 1 também não criei dois objetos Integers???

Nos dois casos você esta comparando a referencia mas os primitvos vem de um pool.

Obrigado pela resposta!

Você está verificando se eles apontam para o mesmo local, no primeiro caso como ele vem de um pool, acredito que seja por causa disso que ele dar true; a variável aponta para o mesmo Integer(100), se você fizer o terceiro e assim sucessivamente ele vai apontar para o mesmo Integer(100). Agora no cenário 2 está sendo instanciado, os objetos são distintos, j1 aponta para um objeto, j2 aponta para outro objeto. Acredito que seja isso!

Para comparar objetos você pode utilizar o metódo equals. Da seguinte maneira.

if(Obj1.equals(obj2)==true) { do code }

[quote=Sleipbr]Para comparar objetos você pode utilizar o metódo equals. Da seguinte maneira.

if(Obj1.equals(obj2)==true) { do code }[/quote]
O uso do equals é indiscutível, o que eu havia confundido era variável de referência a objeto com variável de referência a um primitivo.

Obrigado por complementar o post,
Abraço!

[quote=Sleipbr]Para comparar objetos você pode utilizar o metódo equals. Da seguinte maneira.

if(Obj1.equals(obj2)==true) { do code }[/quote]

cara o comoando equals ja retorna um true, então não precisa fazer isso, só faz

if(obj1.equals(obj2)){
//códigos e mais códigos se for verdadeiro a condição;
}

Tente fazer essa mesma comparação fora do intervalo de -128 a 127, que aí tem chance de dar false.

no caso é somente para byte né, que ele trabalha nesse intervalo, o cara estava usando Integer no exemplo.

no caso é somente para byte né, que ele trabalha nesse intervalo, o cara estava usando Integer no exemplo.[/quote]

Quando você compara dois Integer nessa faixa valores citados pelo Bruno, é retornado true mesmo.
Isso funciona devido a caching de classes Wrapper feito pela VM.

Mais informações nesse link: https://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching

no caso é somente para byte né, que ele trabalha nesse intervalo, o cara estava usando Integer no exemplo.[/quote]

Não, o pool de inteiros, sejam eles byte, short, int ou long, na JVM da Oracle mantém em memória os valores de -128 a +127.

Faça o teste:

[code]
for (int i = -150; i < 150; i++) {

Integer a = i;
Integer b = i;

System.out.printf(“Integer %d == %d : %b\n”, a, b, a == b);
}[/code]

Integer -150 == -150 : false
Integer -149 == -149 : false
Integer -148 == -148 : false
Integer -147 == -147 : false
Integer -146 == -146 : false
Integer -145 == -145 : false
Integer -144 == -144 : false
Integer -143 == -143 : false
Integer -142 == -142 : false
Integer -141 == -141 : false
Integer -140 == -140 : false
Integer -139 == -139 : false
Integer -138 == -138 : false
Integer -137 == -137 : false
Integer -136 == -136 : false
Integer -135 == -135 : false
Integer -134 == -134 : false
Integer -133 == -133 : false
Integer -132 == -132 : false
Integer -131 == -131 : false
Integer -130 == -130 : false
Integer -129 == -129 : false
Integer -128 == -128 : true
Integer -127 == -127 : true
Integer -126 == -126 : true
Integer -125 == -125 : true
Integer -124 == -124 : true
Integer -123 == -123 : true
Integer -122 == -122 : true
Integer -121 == -121 : true
Integer -120 == -120 : true
(...)
Integer 120 == 120 : true
Integer 121 == 121 : true
Integer 122 == 122 : true
Integer 123 == 123 : true
Integer 124 == 124 : true
Integer 125 == 125 : true
Integer 126 == 126 : true
Integer 127 == 127 : true
Integer 128 == 128 : false
Integer 129 == 129 : false
Integer 130 == 130 : false
Integer 131 == 131 : false
Integer 132 == 132 : false
Integer 133 == 133 : false
Integer 134 == 134 : false
Integer 135 == 135 : false
Integer 136 == 136 : false
Integer 137 == 137 : false
Integer 138 == 138 : false
Integer 139 == 139 : false
Integer 140 == 140 : false
Integer 141 == 141 : false
Integer 142 == 142 : false
Integer 143 == 143 : false
Integer 144 == 144 : false
Integer 145 == 145 : false
Integer 146 == 146 : false
Integer 147 == 147 : false
Integer 148 == 148 : false
Integer 149 == 149 : false

Nota: O pool só funciona ao instanciar objetos a partir de constantes ou através de autoboxing. new Integer(i) não entra no pool.

By the way, Strings também tem um pool interno, e este pode ser controlado por uma parâmetro pra JVM da Oracle:

http://java-performance.info/string-intern-in-java-6-7-8/

Talvez isso seja importante pra quem trabalha com JRuby.