Я использовал JShell немного, чтобы проверить это, и сегодня я столкнулся с довольно интересным поведением.Что происходит с равенством в JShell/Java 9?
jshell> String a = "A"
a ==> "A"
jshell> String b = "A"
b ==> "A"
jshell> a == b
$4 ==> true
jshell> "A" == "A"
$5 ==> true
Я был первым интересно, если это была особенность Java 9, и я проверил это путем компиляции и запуска этой программы с Java 9
public class Equus {
public static void main(String... args) {
String a = "A";
String b = "A";
System.out.println("a == b");
System.out.println(a == b);
System.out.println("\"A\" == \"A\"");
System.out.println("A" == "A");
}
}
И что интересно, я получил
a == b true "A" == "A" true
Как мой выход также. Что тут происходит? Почему a
и b
равны друг другу и почему "A" == "A"
true?
Это называется _interning_, и это то, что компилятор делает, чтобы оптимизировать себя. Вместо создания дублирующего объекта String для нового _A_ он использует тот, который у него уже есть. [Соответствующий] (http://stackoverflow.com/questions/10578984/what-is-string-interning). –
Есть ли какой-нибудь переключатель, чтобы запретить Java интернировать строки без явного вызова 'String # intern'? –
Вам нужно использовать '.equals()', чтобы проверить, равны или нет _Objects_, вы просто проверяете ссылку. –