Jeśli używasz operatora "==" do działania literałów String, to zależy to od tego, czy wartość literału ciągu jest obecna w "String Pool", czy nie, w twojej zmiennej zmiennej "str" jest ciągiem JVM najpierw sprawdza "String Pool", jeśli zostanie znaleziony, następnie zwraca TRUE else FALSE. Spróbuj następującego kodu metodą intern(), aby ciąg dosłowne dostępny na „ciąg Pool”
String str = "";
int test = 3;
str = String.valueOf(test).intern();
System.out.println("str[" + str + "]\nequals result[" + (str == "3") + "]");
if (str == "3") {
System.out.println("if");
} else {
System.out.println("else");
}
według dokumentacji dla metody intern(): intern() metoda przeszukuje wewnętrzną tablicę ciągów dla ciąg równy temu ciągowi. Jeśli ciąg nie znajduje się w tabeli, zostanie dodany. Odpowiedzi na ciąg zawarty w tabeli, który jest równy temu Stringowi. Ten sam obiekt łańcucha jest zawsze odpowiedziony na ciągi, które są równe.
Funkcja "==" nie jest zalecana do porównywania ciągów. użyj metody equals() lub equalsIgnoreCase()().
Próbowałem nawet w Javie 1.7 bez intern() wyjście
str[3]
equals result[false]
else
z intern() wyjście dochodzi do:
str[3]
equals result[true]
if
Nie jest to problemem jdk 1.4 i 1.5 jest to „logiczne błąd".
Równość łańcuchów jest sprawdzana za pomocą '" 3 ".equals (str)', a nie za pomocą operatora '=='. –
Nie ma to nic wspólnego z różnicą między JDK, ale twoją wiedzą na temat tego, jak porównanie "String" działa w Javie. Sprawdź link podany w moim poprzednim komentarzu – MadProgrammer
, aby porównać równość obiektów w java, musisz użyć 'equals', używając ==, jeśli odnoszą się do tego samego obiektu ... jeśli zostały internowane, to jest to prawda. – nachokk