Pergunta

Sempre que eu usar equals () método com dois StringBuffer diferentes objetos, recebo o resultado como falsa, mas quando eu usar equals () método com dois objetos String diferentes, eu recebo o resultado como verdadeiro. Por quê?

    String s=new String("434");
    String s1=new String("434");

    System.out.println(s.equals(s1));//true

   StringBuffer s=new StringBuffer("434");
   StringBuffer s1=new StringBuffer("434");

   System.out.println(s.equals(s1));//false
Foi útil?

Solução

StringBuffer não sobrescrever equals (). Como tal, Object.equals () é chamado, o que comparar a identidade do objeto (o endereço de memória). Cordas faz override é igual e comparar o conteúdo.

Outras dicas

StringBuffer não substitui Object#equals(), então você está experimentando identidade referência cheques baseados em vez de valor cheques baseados. Como essas instâncias StringBuilder são distintos, cada um com diferentes posições de memória, a implementação base Object#equals() sempre retornará false.

Aqui está a definição a partir de Java 6:

public boolean equals(Object obj) {
  return (this == obj);
}

Veja o problema?

Pelo menos na minha versão do JDK (Sun 1,6), StringBuffer não implementa um método () iguais. Isso significa que ele herda iguais do objeto () método, que é o mesmo que ==

Se você realmente quiser testar duas StringBuffers para a igualdade, você poderia chamar x.toString (). Equals (y.toString ())

Se o que você está procurando fazer é comparar as representações de corda de dois StringBuffer objetos, então o que você quer fazer é:

StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
  // whatever you want to do if they're equal
} else {
  // whatever you want to do if they're not
}

Caso contrário, você está comparando pela igualdade dos dois StringBuffer objetos , e não seu conteúdo - em outras palavras, a execução Objeto # equals (), não (os não-existentes) StringBuffer # iguais ().

é igual só retorna verdade sobre objetos StringBuffer quando os dois objetos são os mesmos. Para comparar StringBuffers da maneira que quiser, use o seguinte:

System.out.println(s.toString().equals(s1.toString());

string s.equals usará tabela de cadeia para comparar as cordas reais onde, como os sb.equals StringBuffer só vai usar a implementação padrão do método é igual e apenas comparar os ponteiros de objeto.

StringBuffer não tem a sua própria Aplicação do método equals que herda o método () da classe de objeto iguais, portanto, os hashvalues ??são comparados em vez de comparar o conteúdo real na StringBuffer. Assim, temos de lançar explicitamente-lo para um objeto string que fornece a implementação para equals () método.

A semântica do objeto String são tais que, se duas instâncias são sempre observados para conter a mesma sequência de caracteres, eles sempre contêm a mesma seqüência de caracteres e pode-se - pelo menos do ponto de vista do próprio objeto String --replace todas as referências a uma das cordas com as referências ao outro sem alterar a semântica do programa. Tais casos podem ser consideradas equivalentes, porque para todos os fins práticos, a única informação encapsulado em um exemplo de String é a sequência de caracteres contidos no exemplo alvo.

Por outro lado, uma variável do tipo StringBuffer não encapsula apenas uma sequência de caracteres, mas também o identidade de um particular, instância. Se duas variáveis ??se referem à mesma instância, mudando para a instância a que se refere a uma variável afetará o exemplo referido pelo outro (já que é a mesma instância). Se eles se referem a diferentes instâncias, alterações no exemplo referido por uma não afeta a instância referida pelo outro. A decisão de não ter StringBuffer equals substituição de Java não foi um resultado de preguiça, mas foi em vez baseado no fato de que os objetos StringBuffer ter uma identidade significativa, e as instâncias disjuntos sempre tem diferentes identidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top