Como comparar valor de um metodo com uma variavel java

Compara��es com o m�todo [b]equals[/b] e com o operador [b]==[/b] Resumindo antes para depois explicar.... equals --> Compara��es dentro do Heap da JVM == --> Compara��es fora do Heap da JVM

[b]O que � o Heap?[/b] O Heap � um local reservado e protegido da JVM (Java Virtual Machine) onde ficam alocados todos os objetos instanciados durante a execu��o de seu programa... cada um destes objetos possui um endereco de memoria onde est� armazenado, e o unico acesso a ele, � por via de uma referencia (armazenada fora do heap).... Esta referencia, tamb�m possui o endereco de memoria, tornando o seu acesso unico e exclusivo a este objeto.

lembre-se que tipos primitivos (int, double, float) tambem ficam fora do HEAP com as referencias para objetos

**** Comparacao utilizando '==' **** quando voce usa o operador "==" para comparar.... voce est� comparando [b]fora do heap[/b] Entao.... no caso disso:

int a = 1; int b = 1; if (a == b) { //instrucao }

� uma comparacao externa ao heap da jvm, ou seja, vai comparar os tipos primitivos, ou seja, se o valor em 'a' eh o mesmo valor em 'b'... resultando � claro, em [b]true[/b] J� no caso da comparacao de OBJETOS, utilizando o '==' ficaria desta forma:

MeuObjeto obj1 = new MeuObjeto("Java"); MeuObjeto obj2 = new MeuObjeto("Free"); if (obj1 == obj2) { //instrucao }

Ai voce est� comparando os objetos fora do heap, ou seja, comparando apenas suas referencias....... Resultando na seguinte pergunta para a jvm em tempo de execucao:

[b]"A referencia obj1 aponta para um objeto no Heap, e a referencia obj2 tambem aponta para um objeto no Heap, esses 2 objetos, [u]SAO O MESMO OBJETO[/u]?"[/b]

Ai a jvm obviamente vai retornar false, pq cada um eh um objeto ("java" != "free")... agora no caso:

MeuObjeto obj1 = new MeuObjeto("Lucas"); MeuObjeto obj2 = obj1;

O que eu fiz, foi instanciar um novo "MeuObjeto" (dentro do heap) e apontar obj1 (fora do heap) para ele.... depois criei uma nova referencia (fora do heap) chamada obj2, e apontei para obj1... ou seja... para o mesmo objeto..... exemplo de que eh o mesmo objeto, se eu fizer:

System.out.println( obj2.getNome() );

provavelmente eu teria a saida: Lucas :o :o Continuando com esse exemplo, se eu efetuasse a comparacao, ficaria assim:

if (ob1 == obj2) { //instrucao }

Ai sim, a saida seria [b]true[/b] pois a referencia aponta para o mesmo objeto.... **** Comparacao utilizando 'equals'' **** � o [i]_inverso_[/i] da '==' compara os objetos dentro do heap, ou seja.... suas caracteristicas... um exemplo b�sico e auto-explicativo seria.....

String nome1 = "Lucas"; String nome2 = "Jose"; if (nome1.equals(nome2)) { //isntrucao }

Ai sim, seria false, pois o VALOR das 2 sao diferentes... Por isso que � ideal quando criamos (minha opiniao) um novo objeto, do tipo por exemplo, PESSOA, sobrescrevermos o metodo 'equals' herdado de Object..... para podermos ver se as pessoas sao iguais..... exemplo b�sico e tosco:

public class Pessoa extends Object implements Serializable { private int idade; private String nome; public Pessoa() { setIdade(0); setNome("Alguem"); } public void setIdade(int i) { if (idade < 0) throw new RuntimeException("Idade Negativa"); else this.idade = i; } public void setNome(String n) { //checo se a referencia para o nome existe... if (n == null) throw new RuntimeException("Nome Invalido"); else this.nome = n; } public String getNome() { return nome; } public int getIdade() { return idade; } public boolean equals(Pessoa p) { boolean ret = false; if ( (this.nome.equals(p.getNome())) && (this.idade == p.getIdade()) ) ret = true; return ret; } }

O ideal seria tamb�m uma implementa��o do metodo hashcode, mas fica para a pr�xima.... :!: :!: :!: Deu pra entender???? Abra�os a todos do JF! :!: :!: :!: :!: :!: :!: :o :o :o :!: :!: :metal:

Posts

Muito bom, parab�ns ;) :!:

agora q vc vai dizer isso ?:?? ahuauhauh dps de eu ficar quebrando a cabe�a l� !! :idea:

[quote="Lupus_Ragabash"]agora q vc vai dizer isso ?:?? ahuauhauh dps de eu ficar quebrando a cabe�a l� !! :idea:

Hehehehehehe... se tivesse varrido as dicas antes Lupus! Isso t� ai faz tempoooooo :!: Valeu cara!

tenho duvida em como definir classe e metodos

Sobrou uma duvidasinha Object ob = new Objetc{"Java"}; Object ob2 = new Objetc{"Java"}; if (ob==ob2) verdadeiro ou falso?

[quote="vonlinkerstain"]Sobrou uma duvidasinha Object ob = new Objetc{"Java"}; Object ob2 = new Objetc{"Java"}; if (ob==ob2) verdadeiro ou falso?

Hum.... que construtor maluco � esse ai? :arrow:

S� uma curiosidade besta... supondo que tenha dois objetos iguais, construidos em diferentes partes do programa, qual seria a resposta para isso? Object ob = new Objetc{"Java"}; Object ob2 = new Objetc{"Java"}; if (ob==ob2) verdadeiro ou falso?

[quote="vonlinkerstain"]S� uma curiosidade besta... supondo que tenha dois objetos iguais, construidos em diferentes partes do programa, qual seria a resposta para isso? Object ob = new Objetc{"Java"}; Object ob2 = new Objetc{"Java"}; if (ob==ob2) verdadeiro ou falso?

Sem levar em conta a corretude de seu c�digo, considerando que new Object(String arg) seja um construtor qualquer, o resultado da igualdade � Falso, Pois apontam pra "�reas de mem�ria" diferentes Mas caso o m�todo equals de seu Object fict�cio compare o valor de args passado no construtor, ent�o a igualdade: � Verdadeira, como est� muito bem explicado pelo Lucas.

Hum interessante... Isso foi o que eu fiquei em d�vida... Se ele s� comparava pelo endere�amento ou n�o.. Legal. P.S. N�o implementei nada parecido, s� tinha isso como uma d�vida t�cnica

public static void main(String[] args) { String s = new String("Camila"); String s2 = new String("Camila"); if(s.equals(s2)) { System.out.println("s.equals(s2)"); //retorna true } if (s == s2) { System.out.println("s == s2"); //retorna false } String s3 = "Camila"; String s4 = "Camila"; if(s3.equals(s4)) { System.out.println("s3.equals(s4)"); //retorna true } if (s3 == s4) { System.out.println("s3 == s4"); //retorna true } } Pq quando eu uso String s3 = "Camila"; ele retorna os if = true e uso String s = new String("Camila"); s� o if com equals ele retorna true... algu�m poderia me dizer??????? :wink: bigada

pq existe um pool de string em java. quando vc instancia strings assim:

// como ainda n�o existe nenhuma instacia da string "Camila" no pool // � criado uma e faz s3 refrenciar a ela. String s3 = "Camila"; // aqui j� existe uma instancia de "Camila" no pool de strings ent�o // s4 passa tb referenciar a mesma instancia. String s4 = "Camila";

hehehe isso � para poupar recursos da maquina. =* beijos!

Pq String tem um comportamento especial, s�o mantidas em um pool e s�o imut�veis. Por causa do pool todas as vari�veis string com mesmo valor apontam para a mesma string em mem�ria mas quando vc utiliza a constru��o:

String s = new String( "texto" );

vc for�a a cria��o da string fora do pool e consequentemente em outro endere�o de mem�ria. Por isso o teste com equals retorna verdadeiro e o teste com == que testa o endere�o de mem�ria retorna falso. flw

String nome = "victor"; nome = "hugo"; nome = "victor hugo";

na 1� linha deste trecho, � criado uma referencia para o objeto string e tambem o objeto com valor de "victor". Na 2� linha a JVM faz da variavel string nome (ou referencia de memoria do objeto), um stringbuffered chamado nome que aponta para o novo objeto de valor "hugo". Na 3� linha o objeto de valor "hugo" recebe agora o valor "victor hugo" e o carbage collector se encarrega de destruir os demais objetos. a classe string n�o � capaz de alterar o seu conte�do por isso a JVM cria um stringbuffered quando verifica que a muitas altera��es nesse objeto

Muito bom o POST, muita gente como eu mesmo, nao sabia definir muito bem quando utilizar if ( == ) {} ou quando utilizar x.equals(y) ... Parabens pelo topico ! abra�o !

Muito bom esse post, s� que ainda fiquei com uma d�vida: String a = "x"; String b = "y"; if(a+b == a+b) retorna false. lgu�m pode me dar um help? :mrgreen: