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: |