Ao testar a igualdade de String
's em Java, sempre usei equals()
porque para mim esse parece ser o método mais natural para isso. Afinal, o nome já diz o que pretende fazer. No entanto, um colega meu recentemente me disse que havia sido ensinado a usar em compareTo() == 0
vez de equals()
. Isso parece não natural (visto que compareTo()
se destina a fornecer uma ordem e não comparar para igualdade) e até um pouco perigoso (porque compareTo() == 0
não implica necessariamente igualdade em todos os casos, embora eu saiba que significa para String
's) para mim.
Ele não sabia por que foi ensinado a usar em compareTo()
vez de equals()
para String
, e também não consegui encontrar nenhuma razão para isso. É realmente uma questão de gosto pessoal ou existe alguma razão real para qualquer um dos métodos?
.equalsIgnoreCase()
é a comparação mais rápida se for apropriado, caso contrário,.equals()
é o que você deseja.compareTo() == 0
não implica necessariamente igualdade em todos os casos". Isso é absolutamente correto! Isso é exatamente o que a frase "consistente com igual" significa nas especificações da API Java, por exemplo, na especificação da classe Comparable . Por exemplo, o método de comparação de String é consistente com igual, mas o método de comparação de BigDecimal é inconsistente com igual.Respostas:
A diferença é que
"foo".equals((String)null)
retorna falso enquanto"foo".compareTo((String)null) == 0
lança uma NullPointerException. Portanto, eles nem sempre são intercambiáveis, mesmo para Strings.fonte
As 2 principais diferenças são:
equals
tomará qualquer objeto como parâmetro, mascompareTo
só aceitará Strings.equals
apenas informa se eles são iguais ou não, mascompareTo
fornece informações sobre como as Strings são comparadas lexicograficamente.Dei uma olhada no código da classe String , e o algoritmo em compareTo e equals parece basicamente o mesmo. Acredito que a opinião dele foi apenas uma questão de gosto e concordo com você - se tudo o que você precisa saber é a igualdade das cordas e não qual vem primeiro lexicograficamente, então eu usaria
equals
.fonte
Ao comparar por igualdade, você deve usar
equals()
, porque expressa sua intenção de forma clara.compareTo()
tem a desvantagem adicional de funcionar apenas em objetos que implementam oComparable
interface.Isso se aplica em geral, não apenas para Strings.
fonte
compareTo
tem fazer mais trabalho se as cordas tiverem comprimentos diferentes.equals
pode apenas retornar falso, enquantocompareTo
deve sempre examinar caracteres suficientes para encontrar a ordem de classificação.fonte
compareTo()
não se aplica apenas a Strings, mas também a qualquer outro objeto porquecompareTo<T>
leva um argumento genéricoT
. String é uma das classes que implementou ocompareTo()
método implementando aComparable
interface. (compareTo () é um método para a Interface comparável).Portanto, qualquer classe está livre para implementar a interface Comparable.Mas
compareTo()
dá a ordenação de objetos , usada normalmente na classificação de objetos em ordem crescente ou decrescente enquantoequals()
só vai falar sobre a igualdade e dizer se eles são iguais ou não.fonte
No contexto da string:
compareTo: Compara duas strings lexicograficamente.
é igual a: compara esta string com o objeto especificado.
compareTo compara duas strings por seus caracteres (no mesmo índice) e retorna um inteiro (positivo ou negativo) de acordo.
fonte
Uma diferença muito importante entre compareTo e equals:
equals () verifica se dois objetos são iguais ou não e retorna um booleano.
comparado a() (da interface Comparable) retorna um inteiro. Ele verifica qual dos dois objetos é "menor que", "igual a" ou "maior que" o outro. Nem todos os objetos podem ser ordenados logicamente, portanto, um método compareTo () nem sempre faz sentido.
Observe que equals () não define a ordem entre objetos, o que compareTo () faz.
Agora, aconselho você a revisar o código-fonte de ambos os métodos para concluir que equals é preferível a compareTo, que envolve alguns cálculos matemáticos.
fonte
Parece que os dois métodos fazem praticamente a mesma coisa, mas o método compareTo () usa uma String, não um Object, e adiciona algumas funcionalidades extras ao método equals () normal. Se você só se preocupa com a igualdade, o método equals () é a melhor escolha, simplesmente porque faz mais sentido para o próximo programador que examinar seu código. A diferença de tempo entre as duas funções diferentes não deve importar, a menos que você esteja percorrendo uma grande quantidade de itens. O compareTo () é realmente útil quando você precisa saber a ordem das Strings em uma coleção ou quando você precisa saber a diferença de comprimento entre as strings que começam com a mesma sequência de caracteres.
fonte: http://java.sun.com/javase/6/docs/api/java/lang/String.html
fonte
equals()
deve ser o método de escolha no caso do OP.Olhando para a implementação de
equals()
ecompareTo()
em java.lang.String no grepcode , podemos facilmente ver que igual é melhor se estivermos apenas preocupados com a igualdade de duas Strings:equals()
:e
compareTo()
:Quando uma das strings é prefixo de outra, o desempenho de
compareTo()
é pior, pois ainda precisa determinar a ordem lexicográfica enquantoequals()
não se preocupa mais e retorna falso imediatamente.Em minha opinião, devemos usar esses dois como foram planejados:
equals()
para verificar a igualdade, ecompareTo()
para encontrar a ordem lexical.fonte
equals () verifica se duas strings são iguais ou não. Fornece um valor booleano. compareTo () verifica se o objeto string é igual, maior ou menor ao outro objeto string. Ele dá o resultado como: 1 se o objeto string for maior 0 se ambos forem iguais a -1 se string for menor que outra string
eq:
fonte
Há certas coisas que você precisa manter em mente ao substituir compareTo em Java, por exemplo, Compareto deve ser consistente com igual e a subtração não deve ser usada para comparar campos inteiros, pois eles podem estourar. verifique Coisas a lembrar ao substituir Comparator em Java para obter detalhes.
fonte
Este é um experimento em necromancia :-)
A maioria das respostas compara diferenças de desempenho e API. Eles perdem o ponto fundamental de que as duas operações simplesmente têm semânticas diferentes.
Sua intuição está correta. x.equals (y) não é intercambiável com x.compareTo (y) == 0. O primeiro compara a identidade, enquanto o outro compara a noção de 'tamanho'. É verdade que em muitos casos, especialmente com tipos primitivos, esses dois se alinham.
O caso geral é este:
Se x e y forem idênticos, eles compartilham o mesmo 'tamanho': se x.equals (y) for verdadeiro => x.compareTo (y) é 0.
No entanto, se xey compartilham o mesmo tamanho, isso não significa que sejam idênticos.
se x.compareTo (y) for 0, não significa necessariamente que x.equals (y) seja verdadeiro.
Um exemplo atraente em que a identidade difere do tamanho são os números complexos. Suponha que a comparação seja feita por seu valor absoluto. Portanto, dados dois números complexos: Z1 = a1 + b1 * i e Z2 = a2 + b2 * i:
Z1.equals (z2) retorna verdadeiro se e somente se a1 = a2 e b1 = b2.
No entanto, Z1.compareTo (Z2) retorna 0 para um número infinito de (a1, b1) e (a2, b2) pares, desde que satisfaçam a condição a1 ^ 2 + b1 ^ 2 == a2 ^ 2 + b2 ^ 2.
fonte
Equals pode ser mais eficiente do que compareTo.
Se o comprimento das sequências de caracteres em String não corresponder, não há como as Strings serem iguais, então a rejeição pode ser muito mais rápida.
Além disso, se for o mesmo objeto (igualdade de identidade em vez de igualdade lógica), também será mais eficiente.
Se eles também implementassem o cache de hashCode, poderia ser ainda mais rápido rejeitar não iguais no caso de seus hashCode não corresponderem.
fonte
String.equals()
requer a chamada doinstanceof
operador, enquantocompareTo()
não requer. Meu colega notou uma grande queda no desempenho causada por um número excessivo deinstanceof
chamadas noequals()
método, mas meu teste provoucompareTo()
ser apenas um pouco mais rápido.Eu estava usando, no entanto, Java 1.6. Em outras versões (ou outros fornecedores de JDK), a diferença pode ser maior.
O teste comparou cada string em matrizes de 1000 elementos, repetidas 10 vezes.
fonte
compareTo()
é mais rápido do queequals()
? Mas para a maioria dos conjuntos de dados do mundo realequals()
é muito mais rápido do quecompareTo() == 0
.equals()
brilha se as strings têm um prefixo comum, mas comprimentos diferentes ou se são realmente o mesmo objeto.equals
pode aceitar qualquer objeto como parâmetro, mascompareTo
só pode aceitar String.quando chegar a nulo,
compareTo
lançará uma exceçãoquando você quiser saber onde a diferença acontece, você pode usar
compareTo
.fonte
equals
: necessário para verificar a igualdade e restringir duplicatas. Muitas classes da Biblioteca Java usam isso no caso de quererem encontrar duplicatas. por exemploHashSet.add(ob1)
, só adicionará se isso não existir. Portanto, se você estiver estendendo algumas classes como essa, substituaequals()
.compareTo
: necessário para o pedido do elemento. Novamente, para classificação estável, você precisa de igualdade, portanto, há um retorno 0.fonte
É igual a -
1- Substitua o método GetHashCode para permitir que um tipo funcione corretamente em uma tabela hash.
2- Não lance uma exceção na implementação de um método Equals. Em vez disso, retorne false para um argumento nulo.
3-
As invocações sucessivas de x.Equals (y) retornam o mesmo valor, desde que o objeto referenciado por xey não seja modificado.
4- Para alguns tipos de objetos, é desejável ter o teste Equals para igualdade de valor em vez de igualdade referencial. Essas implementações de Equals retornam true se os dois objetos tiverem o mesmo valor, mesmo se não forem a mesma instância.
Por exemplo -
Resultado :-
enquanto compareTo -
Compara a instância atual com outro objeto do mesmo tipo e retorna um inteiro que indica se a instância atual precede, segue ou ocorre na mesma posição na ordem de classificação que o outro objeto.
Ele retorna -
Menor que zero - esta instância precede obj na ordem de classificação. Zero - esta instância ocorre na mesma posição na ordem de classificação que obj. Maior que zero - esta instância segue obj na ordem de classificação.
Ele pode lançar ArgumentException se o objeto não for do mesmo tipo que a instância.
Por exemplo, você pode visitar aqui.
Portanto, sugiro usar Equals em vez de compareTo.
fonte
GetHashCode()
método. Você quer dizerhashCode()
?"igual" compara objetos e retorna verdadeiro ou falso e "comparar com" retorna 0 se for verdadeiro ou um número [> 0] ou [<0] se for falso aqui um exemplo:
Resultados:
Documentação Compare com: https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
Documentação igual a: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
fonte
Aqui, uma coisa é importante ao usar
compareTo()
overequals()
quecompareTo
funciona para as classes que implementam a interface 'Comparable', caso contrário, ele gerará umNullPointerException
.String
classes implementa interface Comparable enquantoStringBuffer
não, portanto, você pode usar"foo".compareTo("doo")
emString
objeto, mas não emStringBuffer
objeto.fonte
Isso imprime -2 e falso
Isso imprime 2 e falso
Isso imprime 0 e verdadeiro
equals retorna booleano se e somente se ambas as strings forem correspondentes.
compareTo destina-se não apenas a dizer se eles correspondem, mas também qual String é menor que a outra, e também por quanto, lexicograficamente. Isso é usado principalmente durante a classificação na coleção.
fonte
Eu acredito
equals
eequalsIgnoreCase
métodos deString
retornotrue
efalse
que é útil se você quiser comparar os valores do objeto string, mas em caso de implementaçãocompareTo
ecompareToIgnoreCase
métodos de retornos positivos, negativos e zero, valor que será útil em caso de classificação.fonte