Tipos primitivos x Classes  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
Rasa
What is classpath?
[Avatar]

Membro desde: 27/08/2008 11:21:30
Mensagens: 6
Localização: São Paulo
Offline

Pessoal, estava estudando orientação a objetos e, pela minha lógica, quando fazemos: Integer x = new Integer(100);, x guardaria o valor da referência na memoria de um objeto da classe Integer, Certo? Logo se tivermos o código abaixo:

Integer x = new Integer(100);
Integer y = new Integer(100);
if(x == y)
System.out.println("Sao Iguais");

O programa não mostra o "Sao Iguais" pois apontam para objetos diferentes (precisariamos comparar x.equals(y)) . Porém se tivermos o código abaixo:
Integer x = new Integer(100);
int y = 100;
if(x == y)
System.out.println("Sao Iguais");

O programa passa no if e exibe o "Sao Iguais" como pode acontecer isso??

[MSN]
Zeed01
Virtual Machine Man

Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline

Boa madrugada Colegas !

Ops... falei besteira.
Mas aqui

if (x == y)

funcionou...

[]s

This message was edited 1 time. Last update was at 29/08/2008 01:37:02

Rasa
What is classpath?
[Avatar]

Membro desde: 27/08/2008 11:21:30
Mensagens: 6
Localização: São Paulo
Offline

Mas funcionou nesse caso:

Integer x = new Integer(100);
Integer y = new Integer(100);
if(x == y)
System.out.println("Sao Iguais");


Quero dizer, o seu programa exibe a mensagem "Sao Iguais"????

Valeu.
[MSN]
Zeed01
Virtual Machine Man

Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline

Boa madrugada Colegas !

Não... nesse caso você tem que usar o equals mesmo...

[]s
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20512
Localização: Curitiba/PR
Offline

O java tem um cache interno, que vai de -128 até 128 (1 byte). Assim, tipos criados com autoboxing (ou seja, automaticamente convertidos de int para Integer), tentam sempre que possível utilizar esse cache.

Ou seja, quando você faz:


O java vai até uma tabelinha, que contém vários Integer já criados (de -128 até 128 ), acha lá o objeto que corresponde ao 100, e usa esse objeto nos três casos. Se o 100 ainda não foi usado, um novo objeto será criado e adicionado a essa tabela, para então ser reusado em novas conversões. Como no fundo as três referências contém efetivamente o mesmo objeto, comparações com == irão funcionar. Isso é vantajoso pois o equals funciona mais rápido em objetos idênticos. Já que uma implementação típica começará testando pela identidade:



Você pode pedir explicitamente para não usar o cache através do comando new. Se fizer:



Terá objetos diferentes.

Via de regra, a comparação com == em objetos diz se eles são o mesmo objeto, isto é, se ocupam a mesma posição de memória. Ele não testa igualdade, mas sim, identidade.

Com objetos a única coisa que testa igualdade é o método equals. A definição de igualdade entre dois objetos é relativa. No caso do Integer é clara, dois objetos desse tipo são iguais sempre que seu valor inteiro interno for igual.

Outra forma de usar o cache, é criando inteiros através do método valueOf, ao invés do new:


Esse cache existe para todos os objetos que representam inteiros: Byte, Short Integer e Long.

This message was edited 8 times. Last update was at 29/08/2008 07:08:59


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
rissato
JavaEvangelist
[Avatar]

Membro desde: 16/05/2006 22:07:12
Mensagens: 446
Localização: Uberlândia
Offline

autoboxing...

como tem um primitivo na comparação, o == funciona como em tipos primitivos...

Quer vc pense que é capaz ou não, vc está certo!

Sun Certified Java Programmer 6.0
[MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20512
Localização: Curitiba/PR
Offline

Nesse caso, é auto-unboxing.

Realmente, comparar Integer com int, o Integer será convertido para int antes da comparação.

Assim:


Equivale à:


Com direito inclusive a NullPointerException, caso a variável y seja nula.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Zeed01
Virtual Machine Man

Membro desde: 27/10/2006 16:44:29
Mensagens: 668
Offline

Bom dia Colegas !

ViniGodoy:

Show de bola sua explicação !
Mas se puder exclarecer mais uma dúvida, eu ficaria muito grato !

No caso de:



A comparação que é feita é se trata-se do mesmo objeto ou se os valores são iguais ?
O rissato disse alguma coisa sobre autoboxing...

[]s
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20512
Localização: Curitiba/PR
Offline

Por que se trata do mesmo objeto. Quando ambos são objetos, não existe o unboxing.

Só existe se um deles for objeto e o outro um tipo primitivo.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Rasa
What is classpath?
[Avatar]

Membro desde: 27/08/2008 11:21:30
Mensagens: 6
Localização: São Paulo
Offline

Ok, muito obrigado, vocês realmente tiraram minha dúvida.
[MSN]
Rasa
What is classpath?
[Avatar]

Membro desde: 27/08/2008 11:21:30
Mensagens: 6
Localização: São Paulo
Offline

Boa tarde, tenho outra dúvida, não consegui entender o que o operador ^ faz exatamente no código abaixo, quero dizer, porque é que o resultado de b é 5?

public class Programa {
public static void main (String []args){

byte b = 10; // 00001010 binary
byte c = 15; // 00001111 binary
b = (byte) (b^c);
System.out.println("Conteudo de b: " + b);
}
}
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20512
Localização: Curitiba/PR
Offline

Você só vai entender se olhar para os bits, não para o valor decimal.
Esse operador é o de ou exclusivo, ou XOR.

O que ele faz é o seguinte. Todo lugar que os bits em A e B foram idênticos, ele retorna 0. Caso contrário, ele retorna 1.
assim:
00001010 ^
00001111
------------
00000101 (5 decimal).

Note que essa é uma operação reversível.
00000101 ^
00001111
-----------
00001010


00000101 ^
00001010
-----------
00001111

Não é a toa que isso é usado em criptografia. Escolha um número qualquer, aplique o XOR dele em todos os bytes de um arquivo e você terá um arquivo com uma criptografia simétrica simples. Para retornar ao arquivo original, basta reaplicar o XOR com o mesmo número em todos os bytes novamente. Esse número, que só você saberá qual foi, é a chave do seu algoritmo.

Para ver a lista completa dos operadores, veja:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/opsummary.html

This message was edited 3 times. Last update was at 29/08/2008 12:10:20


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20512
Localização: Curitiba/PR
Offline

Rasa, só um pedido, pode ler esse post aqui?
http://www.guj.com.br/posts/list/50115.java

Ele vai te ensinar a como formatar códigos corretamente aqui no fórum, usando a tag code. Ajuda muito para a gente ter o código todo colorido. Ele também ensina alguns outros recursos do fórum.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Rasa
What is classpath?
[Avatar]

Membro desde: 27/08/2008 11:21:30
Mensagens: 6
Localização: São Paulo
Offline

Muito obrigado, estava mesmo tentando colocar o meu código deste jeito, pode deixar que usarei esses recursos, quanto ao operador de XOR endendi como funciona, Valeu pela explicação.
[MSN]
Rasa
What is classpath?
[Avatar]

Membro desde: 27/08/2008 11:21:30
Mensagens: 6
Localização: São Paulo
Offline

Opa pessoal, alguém saberia me dizer para que serve o operador >> do java?

Grato?
[MSN]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team