Jaka jest różnica między tą String#equals
metodą a String#contentEquals
metodą?
152
Jaka jest różnica między tą String#equals
metodą a String#contentEquals
metodą?
String#equals()
Porównuje nie tylko treść napisu, ale także sprawdza, czy inny obiekt jest instancją String
. String#contentEquals()
Porównuje tylko zawartość (sekwencja znaków) i czy nie sprawdzić, czy inny obiekt jest instancją String
. Może to być coś tak długo, jak jest to realizacja CharSequence
, która obejmuje ao String
, StringBuilder
, StringBuffer
, CharBuffer
, itd.
==
(contentEquals) i===
(equals) w javascript?==
operator zezwala tylko na porównywanie odniesień, a nie zawartości dwóch obiektów.==
wspomniany jest tylko JavaScript; nigdy nie wspomniano o Javie.==
w JavaScript jest znacznie luźniejsze niżcontentEquals
, na przykład nie zmieniają liczb), ale masz rację co doequals
sprawdzania dokładnego dopasowania typu zStrings
(inne klasy mogą być luźniejsze z typami w swoichequals
metodach) .Mówiąc prościej:
String.contentEquals()
jest mądrzejszym bratemString.equals()
, ponieważ może być bardziej swobodny w implementacji niżString.equals()
.Istnieje kilka powodów, dla których istnieje oddzielna
String.contentEquals()
metoda. Myślę, że najważniejszym powodem jest:equals
Metoda musi być refleksyjny. Oznacza to, że:x.equals(y) == y.equals(x)
. Oznacza to, żeaString.equals(aStringBuffer)
musiałoby to być to samo, coaStringBuffer.equals(aString)
. Wymagałoby to od programistów Java API wykonania specjalnej implementacji dla Strings wequals()
metodzie StringBuffer, StringBuilder i CharSequence. To byłby bałagan.To jest, gdy
String.contentEquals
przychodzi w. Jest to metoda samodzielna że ma nie muszą przestrzegać surowych wymogów i zasad dlaObject.equals
. W ten sposób można swobodniej realizować poczucie „równej treści” . Pozwala to na przykład na dokonywanie inteligentnych porównań między StringBuffer i String.I powiedzieć, na czym dokładnie polega różnica:
String.contentEquals()
potrafi porównać zawartość aString
, aStringBuilder
, aStringBuffer
, aCharSequence
i wszystkich ich klas pochodnych. Jeśli parametr jest typu String,String.equals()
wykonaj polecenie.String.equals()
porównuje tylko obiekty typu String. Wszystkie inne typy obiektów są uważane za nierówne.String.contentEquals()
potrafi porównaćStringBuffer
iStringBuilder
w inteligentny sposób. Robi nie wywołać ciężkietoString()
metoda, która kopiuje całą zawartość do nowego obiektu String. Zamiast tego porównuje się z podstawowąchar[]
tablicą, co jest świetne.źródło
Ta odpowiedź została już opublikowana przez dbw, ale usunął ją, ale miał kilka bardzo ważnych punktów za różnicę, porównując czas wykonania, jakie wyjątki są wyrzucane,
Jeśli spojrzysz na kod źródłowy String # equals i String # contentEquals , jasne jest, że istnieją dwie nadpisane metody dla
String#contentEquals
jednej, która bierze,StringBuilder
a drugaCharSequence
.Różnica między nimi,
String#contentEquals
wyrzuci NPE, jeśli podany argument jest,null
aleString#equals
zwrócifalse
String#equals
porównuje zawartość tylko wtedy, gdy podany argument jestinstance of String
inaczej, zwrócifalse
we wszystkich innych przypadkach, ale z drugiej stronyString#contentEquals
sprawdza zawartość wszystkich obiektów, które implementują interfejsCharSequence
.Możesz również zmodyfikować kod tak, aby
String#contentEquals
zwracał niewłaściwy wynik lub wynik, nadpisującequals
metodę przekazanego argumentu, jak pokazano poniżej, ale nie możesz zrobić tych poprawekString#equals
.Poniższy kod zawsze będzie produkować
true
tak długo, jak będzies
zawierał dowolny,string
który ma 3 znakiString#contentEquals
będzie wolniejszy niżString#Equals
w przypadku, gdy podany argument toinstance of String
i długość obuString
jest taka sama, ale zawartość nie jest równa.Przykład, jeśli ciąg jest,
String s = "madam"
aString argPassed = "madan"
następnies.contentEquals(argPassed)
zajmie prawie dwukrotnie czas wykonania w tym przypadku w porównaniu zs.equals(argPassed)
Jeśli długość treści nie jest taka sama dla obu ciągów, funkcja
String#contentEquals
będzie miała lepszą wydajność niżString#Equals
w prawie wszystkich możliwych przypadkach.Jeszcze jeden punkt do jego odpowiedzi
String#contentEquals
zString
obiektu będzie również porównać doStringBuilder
zawartości i zapewnić odpowiedni wynik whileString#Equals
powrócifalse
źródło
String
classequals(Object o)
robi tylkoString
porównanie. AlecontentEquals(CharSequence cs)
sprawdza klasy rozszerzaAbstractStringBuilder
ieStringBuffer
,StringBuilder
aString
także klasę (wszystkie są typuCharSequence
).wynik:
Wyjście pierwszego instr jest
false
ponieważbuilder
nie jest typuString
więcequals()
powracafalse
alecontentEquals()
sprawdza zawartość wszystkich rodzaju jakStringBuilder
,StringBuffer
,String
i jako zawartość jest taka sama stądtrue
.contentEquals
wyrzuci,NullPointerException
jeśli podany argument to,null
aleequals()
zwróci false, ponieważ equals () sprawdza instancję instanceOf (if (anObject instance of String)
), która zwraca false, jeśli argumentem jestnull
.źródło
contentEquals(CharSequence cs)
:java.lang.CharacterSequence
(na przykładCharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)equals(Object anObject)
:java.lang.String
tylkoRTFC :)
Ponieważ odczytanie źródła jest najlepszym sposobem na jego zrozumienie, udostępniam implementacje obu metod (od jdk 1.7.0_45)
Istnieje inna metoda String # contentEquals ():
źródło
equals()
icontentEquals()
są dwie metody wString
klasie, aby porównać dwastrings
istring
zStringBuffer
.Parametry
contentEquals()
sąStringBuffer
iString(charSequence)
.equals()
służy do porównywania dwóchstrings
icontentEquals()
służy do porównywania zawartościString
iStringBuffer
.Metoda
contentEquals
iequals
sąOto kod, który opisuje obie metody
Wynik:
źródło
String # equals przyjmuje Object jako argument i sprawdza, czy jest wystąpieniem obiektu String, czy nie. Jeśli obiekt argumentu to String Object, wówczas porównuje zawartość znak po znaku. Zwraca prawdę w przypadku, gdy zawartość obu obiektów łańcuchowych jest taka sama.
String # contentEquals przyjmuje interfejs CharSequence jako argument. CharSequence można zaimplementować na 2 sposoby - przy użyciu i) klasy String lub (ii) AbstractStringBuilder (klasa nadrzędna StringBuffer, StringBuilder)
W metodzie contentEquals () długość jest porównywana przed jakimkolwiek sprawdzeniem instancji obiektu. Jeśli długość jest taka sama, sprawdza, czy argument object jest instancją AbstractStringBuilder, czy nie. Jeśli tak jest (np. StringBuffer lub StringBuilder), zawartość jest sprawdzana znak po znaku. W przypadku, gdy argument jest instancją obiektu String, wówczas String # równa się wywoływana z String # contentEquals.
Krótko mówiąc,
String # equals porównuje zawartość znak po znaku w przypadku, gdy argument jest również obiektem String. A String # contentEquals porównuje zawartość w przypadku, gdy obiekt argumentu implementuje interfejs CharSequence.
String # contentEquals jest wolniejsze w przypadku, gdy porównujemy dwie treści typu string o tej samej długości, co String # contentEquals wewnętrznie wywołuje String # equals dla obiektu String.
W przypadku, gdy próbujemy porównać obiekty o różnej długości zawartości (powiedzmy „abc” z „abcd”), wtedy String # contentEquals jest szybszy niż String # equals. Ponieważ długość jest porównywana przed jakimkolwiek sprawdzaniem instancji obiektu.
źródło
Do
contentEquals()
kontroli sposobu jest zawartość jest taka sama międzyString
,StringBuffer
itp niektóre rodzaj sekwencji char.źródło
Przy okazji, historycznym powodem tej różnicy jest to, że String pierwotnie nie miał nadklasy, więc String.equals () przyjmuje String jako argument. Kiedy CharSequence został wprowadzony jako nadklasa String, potrzebował własnego testu równości, który działałby we wszystkich implementacjach CharSequence i który nie kolidowałby z equals () już używanym przez String ... więc otrzymaliśmy CharSequence.contentEquals ( ), który jest dziedziczony przez String.
Gdyby CharSequence był obecny w Javie 1.0, prawdopodobnie mielibyśmy tylko CharSequence.equals (), a String po prostu by to zaimplementował.
Ach, radość z rozwijających się języków ...
źródło