.equals() ou ==

Olá pessoal,
Como saberei qdo utilizar .equals() ou == ???

Atc,
Fernando.

equals use para comparar valor e == para comparar a referência.

== é para comparar o valor que uma variável guarda É mais útil para variáveis de tipo primitivos (boolean, byte, short, char, int, long, float e double). Para variáveis do tipo referência, verifica se duas variáveis aponto para o mesmo objeto.

.equals um método para comparar o valor significativo de um objeto cuja variável do tipo referência aponta.

o que o bruno falou esta certissimo, mas tentando facilitar um pouco o entendimento, == você deve usar para tipos primitivos e no caso de objetos apenas para verificar se aquelas 2 variaveis de objetos apontam para o mesmo.

equals é usado para verificar a “equivalencia” de objetos, por exemplo numa classe Pessoa, como não existem 2 pessoas com o mesmo rg, caso 2 objetos Pessoa tenha o mesmo rg, o equals deve dar true(por mais que possam ser 2 objetos instanciados em lugares diferentes, criados em separado e não um atribuido ao outro, representam uma pessoa de rg xxxx), porém o == somente resultará true se essas 2 variaveis apontarem para o mesmo objeto na memoria(se vc atribuir um para o outro, pessoa1 = pessoa2;).

Exemplo Básico

Pessoa obj1 = new Pessoa();
Pessoa obj2 = new Pessoa();

Forma incorreta de verificar o conteudo de objetos obj1 == obj2; // Erro, pois obj1 nao é igual ao obj2, pois estao localizados em locais diferentes de memória

Maneira correta de verificar:obj1.equals(obj2); // Correto, pois verifica se obj1 tem o mesmo conteudo de obj2

A não ser que:

Pessoa obj1 = new Pessoa();
Pessoa obj2 = obj1;

Neste caso, obj1 e obj2 estão localizados no mesmo espaço de memória. Desta forma podemos utilizar ‘==’ para verificar o conteudo dos objetos.

ESPERO TER AJUDADO. XD

3 curtidas

Só complementando o que o nosso amigo Thiago falou:

Versão 1

class Pessoa {	
	private String nome;	
}

Versão 2

class Pessoa {	
	private String nome;		

	public boolean equals(Object o) { 
		
		Pessoa aux = (Pessoa) o;
		
		if(this.nome.equals(aux.nome))
			return true;
		return false;
		
	}
}
public class TesteEquals {

	public static void main(String[] args) {
		
		Pessoa p1 = new Pessoa();
		Pessoa p2 = new Pessoa();
		
                //leve em consideração que o campo nome das Classes Pessoa foram setados

		System.out.println(p1 == p2); // retorna false pela explicação do nosso amigo Thiago
		System.out.println(p1.equals(p2)); // neste caso também retorna false pois a classe pessoa nao sobrescreve o método equals - utilizando versão 1 da classe Pessoa
		System.out.println(p1.equals(p2)); // neste caso retorna true - utilizando versão 2 da classe Pessoa
	}

}

Ai existem as maneiras mais corretas de se implementar o método equals.

Abraço a todos.

O resumo prático é o seguinte:

a) Está usando objetos? Compare com equals;
b) Está usando tipos primitivos? Use ==.

Simples assim.

[quote=ViniGodoy]O resumo prático é o seguinte:

a) Está usando objetos? Compare com equals;
b) Está usando tipos primitivos? Use ==.

Simples assim.[/quote]

Isso funciona em 90% dos casos. Você também pode usar == com objetos, caso deseje saber se ambos estão na mesma área de memória.

Eu diria que isso funciona em 99.9% dos casos (e por isso é uma regra prática, não uma lei). Quando você vai querer saber se dois objetos estão na mesma área de memória???

Ok, == pode ser usado em enums, mesmo que os enums sejam objetos, já que você sabe que, com certeza, só haverá uma instância daquele objeto. Por outro lado, é exatamente um teste com == que um enum irá fazer, caso você também use o equals.

[quote=santos.fernando]Olá pessoal,
Como saberei qdo utilizar .equals() ou == ???
[/quote]

== compara o conteúdo de variáveis.
.equals() serve para saber se dois objetos são equivalentes.

Objetos não ficam nas variáveis , ou melhor, não existe variáveis de objeto em java. Existem variáveis de referencia.
As variáveis de referencia contêm um numero que indica a qual objeto a variável se referencia. usando == nestas variáveis vc estará comparando esse numero de referencia que não significa nada excepto quando é null ou é igual a um outro. == serve portanto para saber se a variável referencia algum objeto ou não e para saber se duas variáveis referenciam o mesmo objeto.

Mais detalhes sobre como comparar em java

Vini vc falou que só para 99,9% das vezes o == servira
para saber se dos objetos possuem o mesmo endereço
na memória em bytes , qua seria outra maneira 100%
eficaz?
Obrigado

[quote=MarcioCasteloBranco]Vini vc falou que só para 99,9% das vezes o == servira
para saber se dos objetos possuem o mesmo endereço
na memória em bytes , qua seria outra maneira 100%
eficaz?
Obrigado[/quote]

100% eficaz é saber o que está fazendo. Por exemplo, em 99% do tempo você compara 2 strings com equals. Só que quando você precisa comparar uma variável string para saber se ela é null, você precisa usar “==”, não equals, que precisa de 2 objetos.

Eu diria que isso funciona em 99.9% dos casos (e por isso é uma regra prática, não uma lei). Quando você vai querer saber se dois objetos estão na mesma área de memória???[/quote]

Um exemplo…

[code] public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == botao){

	}
	
}[/code]

Realmente, isso funciona mesmo.

E até pode fazer parte do 0.1%, se você tratar eventos dessa forma.

O único detalhe é que essa é a pior maneira de se testar eventos. Como eles podem ser disparados para listeners diferentes, não tem pq agrupar o tratamento, e depois testar novamente quem é que disparou o evento. O ideal é registrar um ActionListener diferente por botão e agupar apenas botões que tenham tratamento idêntico, no máximo, parametrizados por alguma coisa.

Agora, não sei pq muita gente faz assim aqui no fórum. Será que tem algum professor de faculdade ensinando desse jeito? Ou algum IDE já faz isso por padrão?

Sem falar, que testar com equals teria exatamente o mesmo efeito, já que uma implementação de equals típica começa justamente testando se o argumento recebido é igual a this.

[quote=ViniGodoy][quote=renamed]
Um exemplo…

[code] public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == botao){

	}
	
}[/code]

[/quote]

Realmente, isso funciona mesmo.

E até pode fazer parte do 0.1%, se você tratar listeners dessa forma.

O único detalhe é que essa é a pior maneira de se testar eventos. Como eles podem ser disparados para listeners diferentes, não tem pq agrupar o tratamento, e depois testar novamente quem é que disparou o evento. O ideal é registrar um ActionListener diferente por botão e agupar apenas botões que tenham tratamento idêntico, no máximo, parametrizados por alguma coisa.

Agora, não sei pq muita gente faz assim aqui no fórum. Será que tem algum professor de faculdade ensinando desse jeito? Ou algum IDE já faz isso por padrão?

Sem falar, que testar com equals teria exatamente o mesmo efeito, já que uma implementação de equals típica começa justamente testando se o argumento recebido é igual a this.[/quote]

Independente de você ser adepto a essa forma de tratamento de listener ou não, não é o objetivo desse post. Estou dizendo que há momento em que precisamos usar o “==” fora da “regra geral”, ou dos 99,9% dos casos. Até porque, para mim, não existem professores de faculdade ensinar que sempre usaremos “==” com tipos primitivos e equals em qualquer outro caso do que usar essa forma que mandei. Ou será que existe?

[quote=ViniGodoy][quote=renamed]
Um exemplo…

[code] public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == botao){

	}
	
}[/code]

[/quote]

Agora, não sei pq muita gente faz assim aqui no fórum. Será que tem algum professor de faculdade ensinando desse jeito? Ou algum IDE já faz isso por padrão?
[/quote]

Desconfiu que se trata de um meme virus. Alguem sem compreensão colocou isso em algum artigo de alguma media de grande circulação e o povo - aleanado como é , e sem capacidade de pensar sozinho - simplesmente copy-paste e pronto. Ai outro cara viu esse codigo e assim foi…

Eu acho que isso se deve a uma falta de compreensão de OO e causada por programadores deterministas que não entendem conceitos básicos como o mecanismo de eventos baseado em observers. Programadores que vieram de liguagens procedurais têm esta tendencia determinista.

[quote=sergiotaborda][quote=ViniGodoy][quote=renamed]
Um exemplo…

[code] public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == botao){

	}
	
}[/code]

[/quote]

Agora, não sei pq muita gente faz assim aqui no fórum. Será que tem algum professor de faculdade ensinando desse jeito? Ou algum IDE já faz isso por padrão?
[/quote]

Desconfiu que se trata de um meme virus. Alguem sem compreensão colocou isso em algum artigo de alguma media de grande circulação e o povo - aleanado como é , e sem capacidade de pensar sozinho - simplesmente copy-paste e pronto. Ai outro cara viu esse codigo e assim foi…

Eu acho que isso se deve a uma falta de compreensão de OO e causada por programadores deterministas que não entendem conceitos básicos como o mecanismo de eventos baseado em observers. Programadores que vieram de liguagens procedurais têm esta tendencia determinista.[/quote]

Olá Sérgio.

Realmente estou um pouco confuso, demonstrei um exemplo em que “==” era usado sem a utilização de tipos primitivos, exemplo esse que foi uma solução da própria Sun para tratamento de Listeners,

Acho lamentável que algém se ache melhor do que eu ou de qualquer outra pessoa, realmente não gostaria de entrar em mérito de ataques pessoais, até porque não o conheço e realmente nem faço questão.

Acredito que a participação de todos é bem-vinda, desde que o respeito e a compreensão do ponto de vista de cada um seja integralmente analisado. O que você fez, meu amigo, foi a mais clara demonstração de falta de compreensão no que eu tinha dito. Gostaria que algém colocasse aqui quando eu disse que essa era a melhor solução para tratamento de listeners, apenas escrevi [quote]Um exemplo…[/quote] e isso foi o suficiente para que você julgasse uma pessoa que nunca viu ferozmente e erradamente.

Entrei para esse fórum porque acreditava na sua seriedade. O respeito deve ser a base para o convívio mútuo entre pessoas, mesmo através da internet. Lamentável alguém que tenha opiniões tão formadas agir assim.

[quote=renamed][quote=sergiotaborda][quote=ViniGodoy][quote=renamed]
Um exemplo…

[code] public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == botao){

	}
	
}[/code]

[/quote]

Agora, não sei pq muita gente faz assim aqui no fórum. Será que tem algum professor de faculdade ensinando desse jeito? Ou algum IDE já faz isso por padrão?
[/quote]

Desconfiu que se trata de um meme virus. Alguem sem compreensão colocou isso em algum artigo de alguma media de grande circulação e o povo - aleanado como é , e sem capacidade de pensar sozinho - simplesmente copy-paste e pronto. Ai outro cara viu esse codigo e assim foi…

Eu acho que isso se deve a uma falta de compreensão de OO e causada por programadores deterministas que não entendem conceitos básicos como o mecanismo de eventos baseado em observers. Programadores que vieram de liguagens procedurais têm esta tendencia determinista.[/quote]

Olá Sérgio.

Realmente estou um pouco confuso, demonstrei um exemplo em que “==” era usado sem a utilização de tipos primitivos, exemplo esse que foi uma solução da própria Sun para tratamento de Listeners,

Acho lamentável que algém se ache melhor do que eu ou de qualquer outra pessoa, realmente não gostaria de entrar em mérito de ataques pessoais, até porque não o conheço e realmente nem faço questão.

Acredito que a participação de todos é bem-vinda, desde que o respeito e a compreensão do ponto de vista de cada um seja integralmente analisado. O que você fez, meu amigo, foi a mais clara demonstração de falta de compreensão no que eu tinha dito. Gostaria que algém colocasse aqui quando eu disse que essa era a melhor solução para tratamento de listeners, apenas escrevi [quote]Um exemplo…[/quote] e isso foi o suficiente para que você julgasse uma pessoa que nunca viu ferozmente e erradamente.

Entrei para esse fórum porque acreditava na sua seriedade. O respeito deve ser a base para o convívio mútuo entre pessoas, mesmo através da internet. Lamentável alguém que tenha opiniões tão formadas agir assim.[/quote]

Vc está overreacting. Primeiro, eu nem sequer me referi a vc. Segundo estou apenas respondendo à interrogação do Vini de onde veio essa prática de testar o ativador do evento dentro do listener . Não tem nada a haver com == ou equals, como o ppr vini falou daria no mesmo usar um ou outro. O problema é a existencia do if dentro do listener. Se foi a sun que lançou essa moda, shame on them.
(A sun recomenda essa forma de tratamento para JME, apenas para JME. E isso se deve à limitação do ambiente JME. Não pode ser usado em JSE e dizer que foi a sun que recomendou. As coisas têm um contexto)

Não sei pq vc ficou ofendido.