Pytanie sprowadza się do tego kodu:Obsługa ciągów znaków Java, co jest gwarantowane?
// setup
String str1 = "some string";
String str2 = new String(str1);
assert str1.equals(str2);
assert str1 != str2;
String str3 = str2.intern();
// question cases
boolean case1 = str1 == "some string";
boolean case2 = str1 == str3;
norma Czy Java daje żadnych gwarantuje o wartości case1
i case2
? Link do odpowiedniej części specyfikacji Javy byłby oczywiście niezły.
Tak, sprawdziłem wszystkie "Podobne pytania" znalezione przez SO i nie znalazłem żadnych duplikatów, ponieważ żaden z nich nie odpowiedział na to pytanie w ten sposób. I nie, nie chodzi tu o błędną ideę "optymalizacji" porównań łańcuchów przez zastąpienie equals
przez ==
.
Jeśli to nie jest bezużyteczna próba optymalizacji, co to jest? –
@dystroy Szczególny przypadek, jaki miałem, dotyczył używania znormalizowanych nazw plików do synchronizacji, a jeśli internowane ciągi są bezpieczne do tego celu, lub jeśli potrzebny jest wspólny "Map fileNameToLockObjectMap". Nie będąc pewnym, skończyłem używając mapy w tym przypadku (i nie wracając do zmiany). –
hyde
Blokowanie internowanych łańcuchów nie jest dobrym pomysłem. Jest całkiem prawdopodobne, że będziesz mieć niezamierzone konsekwencje. –