Qual é a diferença entre o String#equals
método e o String#contentEquals
método?
152
Qual é a diferença entre o String#equals
método e o String#contentEquals
método?
A String#equals()
não só compara o conteúdo da string, mas também verifica se a outro objeto também é uma instância de um String
. O String#contentEquals()
único compara o conteúdo (a sequência de caracteres) e não verifica se o outro objeto também é uma instância de String
. Pode ser qualquer coisa, desde que ele é uma implementação CharSequence
que abrange Ao String
, StringBuilder
, StringBuffer
, CharBuffer
, etc.
==
(contentEquals) e===
(iguais) em javascript?==
operador permitirá apenas comparar as referências e não o conteúdo de dois objetos.==
mencionado é apenas JavaScript; isso nunca é mencionado em Java.==
em JavaScript é looser longe do quecontentEquals
, o que não vai tocar números, por exemplo), mas você está correto sobreequals
a verificação de uma partida tipo exato comStrings
(outras classes poderia ser mais flexível com os tipos em seusequals
métodos) .Para simplificar:
String.contentEquals()
é o irmão mais inteligente deString.equals()
, porque pode ser mais livre na implementação do queString.equals()
.Existem algumas razões pelas quais existe um
String.contentEquals()
método separado . A razão mais importante que eu acho é:equals
método deve ser reflexivo. Isso significa que:x.equals(y) == y.equals(x)
. Isso implica queaString.equals(aStringBuffer)
teria que ser o mesmo queaStringBuffer.equals(aString)
. Isso exigiria que os desenvolvedores da API Java fizessem alguma implementação especial para Strings noequals()
método StringBuffer, StringBuilder e CharSequence também. Isso seria uma bagunça.Isto é onde
String.contentEquals
entra. Este é um método autônomo que não não tem que seguir os requisitos e regras estritas paraObject.equals
. Dessa forma, você pode implementar o senso de "conteúdo igual" mais livremente. Isso permite que você faça comparações inteligentes entre um StringBuffer e um String, por exemplo.E para dizer qual é exatamente a diferença:
String.contentEquals()
pode comparar o conteúdo de aString
, aStringBuilder
, aStringBuffer
, aCharSequence
e todas as classes derivadas delas. Se o parâmetro for do tipo String, entãoString.equals()
seja executado.String.equals()
compara apenas objetos String. Todos os outros tipos de objetos são considerados diferentes.String.contentEquals()
pode compararStringBuffer
e deStringBuilder
forma inteligente. Ele não chama otoString()
método pesado , que copia todo o conteúdo para um novo objeto String. Em vez disso, ele se compara àchar[]
matriz subjacente , o que é ótimo.fonte
Essa resposta já foi postada pelo dbw, mas ele a excluiu, mas tinha alguns pontos válidos para a diferença ao comparar o tempo de execução, quais exceções são lançadas,
Se você observar o código-fonte String # equals e String # contentEquals , ficará claro que existem dois métodos substituídos para
String#contentEquals
um que aceitaStringBuilder
e outroCharSequence
.A diferença entre eles,
String#contentEquals
lançará NPE se o argumento fornecido for,null
masString#equals
retornaráfalse
String#equals
compara o conteúdo apenas quando o argumento fornecido é oinstance of String
contrário, ele retornaráfalse
em todos os outros casos, mas, por outro lado,String#contentEquals
verifica o conteúdo de todos os objetos que implementam a interfaceCharSequence
.Você também pode ajustar o código para
String#contentEquals
retornar o resultado errado ou o resultado desejado, substituindo oequals
método do argumento passado conforme mostrado abaixo, mas não pode fazer esses ajustesString#equals
.O código abaixo sempre produzirá
true
contanto ques
contenhastring
3 caracteresString#contentEquals
será mais lento queString#Equals
o argumento fornecidoinstance of String
e o comprimento de ambosString
será o mesmo, mas o conteúdo não será igual.Exemplo se a string for
String s = "madam"
e, emString argPassed = "madan"
seguidas.contentEquals(argPassed)
, levará quase o dobro do tempo de execução nesse caso, em comparação coms.equals(argPassed)
Se o comprimento do conteúdo não for o mesmo para as duas cadeias, a função
String#contentEquals
terá melhor desempenho do queString#Equals
em quase todos os casos possíveis.Mais um ponto a acrescentar à sua resposta
String#contentEquals
de umString
objeto também será comparado aoStringBuilder
conteúdo e fornecerá o resultado apropriado enquantoString#Equals
retornaráfalse
fonte
String
Oequals(Object o)
método de classe faz apenasString
comparação. Mas ascontentEquals(CharSequence cs)
verificações de classes se estendem ,AbstractStringBuilder
ou sejaStringBuffer
,StringBuilder
eString
também de classe (todas elas são do tipoCharSequence
).resultado:
A saída do primeiro stmt é
false
porquebuilder
não é do tipo,String
entãoequals()
retorna,false
mascontentEquals()
verifica o conteúdo de todo o tipoStringBuilder
, comoStringBuffer
,String
e como o conteúdo é o mesmotrue
.contentEquals
jogaráNullPointerException
se o argumento fornecido for,null
masequals()
retornará false, porque o equals () verifica instanceOf (if (anObject instance of String)
) que retorna false se o argumento fornull
.fonte
contentEquals(CharSequence cs)
:java.lang.CharacterSequence
(por exemplo,CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)equals(Object anObject)
:java.lang.String
únicaRTFC :)
Como ler a fonte é a melhor maneira de entendê-la, estou compartilhando as implementações dos dois métodos (a partir do jdk 1.7.0_45)
Há outro método da String # contentEquals ():
fonte
equals()
econtentEquals()
são dois métodos naString
classe para comparar doisstrings
estring
comStringBuffer
.Os parâmetros de
contentEquals()
sãoStringBuffer
eString(charSequence)
.equals()
é usado para comparar doisstrings
econtentEquals()
é usado para comparar o conteúdo deString
eStringBuffer
.Método
contentEquals
eequals
sãoAqui está um código que descreve os dois métodos
Resultado:
fonte
String # equals usa Object como argumento e verifica se é uma instância do objeto String ou não. Se o objeto do argumento for String Object, ele compara o conteúdo caracter por caracter. Retorna true caso o conteúdo dos dois objetos de string seja o mesmo.
A sequência # contentEquals usa a interface CharSequence como argumento. CharSequence pode ser implementado de duas maneiras - usando i) classe String ou (ii) AbstractStringBuilder (classe pai de StringBuffer, StringBuilder)
Em contentEquals (), o comprimento é comparado antes de qualquer verificação da instância do objeto. Se o comprimento for o mesmo, ele verifica se o objeto do argumento é uma instância do AbstractStringBuilder ou não. Se assim for (por exemplo, StringBuffer ou StringBuilder), o conteúdo é verificado, caractere por caractere. Caso o argumento seja uma instância do objeto String, a String # é igual a chamada da String # contentEquals.
Então, resumindo,
String # equals compara o caractere de conteúdo por caractere, caso o argumento também seja objeto de String. E String # contentEquals compara o conteúdo caso o objeto de argumento implemente a interface CharSequence.
String # contentEquals é mais lenta, caso comparemos dois conteúdos de string com o mesmo comprimento que String # contentEquals chama internamente String # igual a para o objeto String.
Caso tentemos comparar objetos com diferentes tamanhos de conteúdo (digamos "abc" com "abcd"), a String # contentEquals é mais rápida que a String # igual. Porque o comprimento é comparado antes de qualquer verificação de instância do objeto.
fonte
Os
contentEquals()
método verifica se os conteúdos são os mesmos entre umString
,StringBuffer
, etc, que algum tipo de sequcia de carvão animal.fonte
BTW, a razão histórica para a diferença é que String originalmente não tinha superclasse, então String.equals () usa uma String como argumento. Quando o CharSequence foi introduzido como a superclasse de String, ele precisava de um teste de igualdade próprio que funcionasse em todas as implementações do CharSequence e que não colidisse com os equals () já em uso pelo String ... então obtivemos CharSequence.contentEquals ( ), que é herdado por String.
Se CharSequence estivesse presente no Java 1.0, provavelmente teríamos apenas CharSequence.equals () e String simplesmente implementaria isso.
Ah, as alegrias das línguas em evolução ...
fonte