Wszyscy wiemy, że jeśli utworzymy dwa obiekty String i użyjemy == do ich porównania, to zwróci wartość false, a jeśli użyjemy metody równości, zwróci true. Ale domyślnie równa się, że metoda implementuje tylko ==, to w jaki sposób zwraca true, powinna zwrócić to, co powróci ==?jak domyślne jest wykonanie w java dla String?
Odpowiedz
equals
Metoda jest pierwotnie metodą klasy Object
. I każda klasa w Javie domyślnie rozszerza klasę Object
. Teraz metoda equals
jest nadpisywana dla klasy String
, aby działała inaczej niż ==
.
To javadoc wyjaśnia to doskonale:
Porównuje ten ciąg do określonego obiektu. Wynikiem jest true wtedy i tylko wtedy, gdy argument nie jest pusty i jest to obiekt String reprezentujący tę samą sekwencję znaków, co obiekt .
To realizacja idzie w następujący sposób:
@override
public boolean equals(Object anObject) {
// This check is just for the case when exact same String object is passed
if (this == anObject) {
return true;
}
// After this only real implementation of equals start which you might be looking for
// For other cases checks start from here
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
metoda równi z klasy String jest przesłonięta i próbuje sprawdzić, czy wszystkie znaki w obu ciągów są równe lub nie. Jeśli zostanie znaleziony, zwróci true. Zatem zachowanie metody równości w klasie String różni się od normalnej implementacji klasy obiektu.
Tak domyślnie równa się metoda implementuje ==
w klasie Object
. Ale możesz zastąpić metodę equals
w swojej własnej klasie, aby zmienić sposób, w jaki equality
jest wykonywany między dwoma obiektami tej samej klasy. Na przykład metoda String
klasy equals
jest przesłonięta, co następuje:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
Więc to jest powód, że za pomocą następującego kodu:
String s1 = new String("java");
String s2 = new String("java");
s1==s2
zwrotów false
ponieważ oba są przedstawieniu różnych obiektów na stercie. Podczas gdy s1.equals(s2)
zwraca true
od tego, co nazywa equals
, to co zdefiniowano w klasie String
, gdzie obiekty String
są porównywane na podstawie contents
ciągu.
Nie domyślnie 'równa się' nie implementuje' == 'dla klasy String. I jego pytanie brzmiało, że nawet jeśli równe sobie zaimplementują '==', obie zachowują się inaczej! – Amar
@Amar: Idź i ponownie przeczytaj pytanie i pomyśl starannie przed odrzuceniem czyjejś odpowiedzi. OP pyta, że skoro metoda "równa się" domyślnie sprawdza dla '==', to jak to się stało, że metoda 'równa się' dla dwóch różnych' String' z tą samą zawartością zwraca 'true'. I to właśnie wyjaśniłem powód tego w mojej odpowiedzi. Ponownie przeczytaj moją odpowiedź też .. –
Może! Co zrozumiałam z pytania, że faktycznie widział implementację Stringa i został zdezorientowany przez początkowe "==" sprawdzenie w metodzie. Jeśli to zrozumienie jest złe, z pewnością odzyskam moje poparcie. BTW, nie ma potrzeby, aby uzyskać osobisty tutaj i komentarz na temat mojej dojrzałości. Chłód. – Amar
.equals()
sprawdza, czy ciągi są identyczne ei. mają te same znaki. ==
sprawdza tylko, czy wskaźniki wskazują te same obiekty. Można mieć różne obiekty z tych samych znaków, to dlaczego należy użyć .equals()
porównać je
String
klasa w Javie nadpisuje metodę Object
klasy equals
taki sposób, że porównuje zawartość dwóch ciągów zamiast porównywania referencji (domyślna implementacja w klasie Object
).
Poniżej realizacji equals
metoda String
klasy:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
- 1. Java isEmpty() undefined dla String?
- 2. Co to jest "String ..." w języku Java?
- 3. superscript w Java String
- 4. UTF-8 Klasa string dla java
- 5. Wykonanie dla zrozumienia w scala
- 6. Jakie jest ustawienie domyślne dla FACELETS_REFRESH_PERIOD?
- 7. Java - Metoda Wywołanie i wykonanie
- 8. Jak przekonwertować Blob String i String do Blob w java
- 9. java: użycie metody executeQuery (string) nie jest obsługiwane?
- 10. Dlaczego jest generowany leniwy łańcuch Java String?
- 11. Jak przekonwertować String na Reader w java
- 12. Jaki jest najlepszy sposób na wykonanie piaskowanego kodu Java?
- 13. String isNullOrEmpty in Java?
- 14. realizacja hashCode Java String
- 15. Java: PrintStream to String?
- 16. + operator dla String w Javie
- 17. Domyślne ikony przycisków czynności w języku Java
- 18. Java: Jak przekonwertować obiekt File na obiekt String w java?
- 19. Właściwości Java obiektu String
- 20. Jakie są wartości domyślne dla Binding.Mode = Domyślne dla formantów WPF?
- 21. Jak przekonwertować kolekcję Groovy String na Java String Array?
- 22. Jak mogę ręcznie opisać przykładowe wejście dla mapy java @RequestBody <String, String>?
- 23. java Format String dziesiętny
- 24. optymalizacji kompilatora Java String
- 25. Jak ustawić domyślne środowisko dla Anacondy/Jupyter?
- 26. Dłuższe wykonanie przez powłokę Java niż konsola?
- 27. Java, Long.parse binarnego String
- 28. Jak ustawić domyślne (globalne) opcje dla pomocników?
- 29. Jak przekonwertować Java String na bajt []?
- 30. Jaki jest ekwiwalent Kotlina dla Java's String []?
równa jest przesłonięta metoda w klasie String. Dlatego. – AmitG