Java sobre moetodo equals()

o metodo equals faz comparação com o “endereço” do objeto certo, certo ?
Mas quando se tem um objeto String oque define o endereço é o conteúdo que o objeto String tem, por tanto oque acaba confundindo quando se tem duas Strings (dois objetos diferentes), elas tem o mesmo conteúdo mas “sim” são objetos diferentes, eu acho isso sacanagem bem trool, se você não for afundo no assunto acaba apanhando . Oque vocês acham sobre isso ?

Posso ter entendido errado, mas cai no caso entre igual and equivalência, podem soar parecidos, mas são bem diferentes. Exemplo seria o = que é diferente do ==.

Acho que é obrigação do desenvolvedor ir a fundo no assunto, independente de qual seja ele.
Afinal, um dos grandes problemas que temos é a superficialidade com a qual se deseja trabalhar. Isso causa código ruim e projetos péssimos.

Porém, no caso do equals, não é bem assim.
Já tentou usar os recursos da tua IDE e sobrescrever o método equals? Você verá que uma série de coisas são comparadas, dentre as quais podemos citar:

  • Classe da qual a instância provém (se não forem objetos da mesma classe, são objetos distintos)
  • hash code (se possuem hash codes diferentes, são objetos distintos)
    Além da validação de nulidade do objeto em si e dos seus atributos (que podem, também, ser objetos).

mas e quando se compara Strings, oque é levado em conta ?

Da uma olhada aqui…

“… todos objetos do Java possuem um outro método chamado equals que é utilizado para comparar objetos daquele tipo. Por padrão, esse método apenas compara as referências dos objetos…”

https://www.caelum.com.br/apostila-java-orientacao-objetos/o-pacote-java-lang/#mtodos-do-javalangobject-equals-e-tostring

vê se ajuda!

Abraço!

Exemplo:

String nome = "Astolpho Pamphilo";

Esta é uma instância de objeto, é uma String e está numa posição de memória X.
Agora, se você comparar com

"Astolpho Pamphilo".equals(nome)

Você tem uma nova instância de objeto da classe String, em uma posição de memória Y e que, pelo conteúdo, obviamente, terá o mesmo hash code, resultando em true como resultado.

A implementação padrão do equals compara a referência do objeto, sim.
Entretanto as subclasses de Object sobrescrevem o método equals (e o método hashcode) caso queiram que a comparação seja baseada em seu conteúdo. Como acontece por exemplo com a classe String e com classes wrapper.

A via de regra é a seguinte:

Quer comparar a referência: usa o ==
Quer comparar conteúdo: usa o equals

Aqui tenho alguns exemplos e explicações:

então como eu resolvo o problema de ter duas Strings(dois objetos distintos), e quero saber se são objetos diferentes ou não, oque devo fazer ?

tipo:

String nome = “nome”;
String nome2 = “nome”;
nome.equals(nome2);

este código retorna “true”(são iguais) sendo que são objetos diferente.O modo de resolver isso seria reescrevendo o método ?

Para testar se a referência é diferente, você utilizaria o == mas no seu exemplo o == também vai retornar true.
Isso acontece pois a classe String tem suas peculiaridades e tratamento diferenciado pelo compilador.
No seu exemplo, tanto a variável nome, quanto a variável nome2 são o mesmo objeto.
Ou seja, ambas apontam para a mesma referência, que é a String "nome".
O compilador Java realiza algumas otimizações, uma delas é utilizar a mesma referência para literais do tipo String.

então quer dizer, é impossível saber que são objetos diferentes quando se tem o mesmo conteúdo em ambas ?
Quando eu digo saber, quero dizer, fazer um verificação no código, e essa verificação me retornar que são objetos diferentes.

Não.
O == em Strings só retorna true para objetos diferentes se forem ambos inicializados diretamente com esse valor.

String a = "uma string"; 
String b = "uma string"; 
String c = "uma" + " string"; 
String d = new String("uma string");
String e1= "uma";
String e2 = " string";
String e = e1+e2;

System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==d);
System.out.println(a==e);


$
true
true
false
false

Não, conforme eu disse, o == compara a referência, isto é, se os dois objetos são o mesmo, se os dois identificadores referenciam o mesmo endereço de memória.

O equals deve ser sobrescrito pelas classes que permitam comparar se o conteúdo é o mesmo.

O que talvez não ficou claro é que, no código fonte, o compilador Java utiliza somente uma referência para literais do tipo String.

Então, se você faz isso:

String a = "texto";
String b = "texto";

O compilador vai dar uma otimizada e só vai haver um objeto String com o conteúdo "texto", dessa forma, os identificadores a e b de fato são o mesmo objeto.

Se você quer dois objetos String diferentes, mas com o mesmo conteúdo, faça:

String a = new String("texto");
String b = new String("texto");