Насколько я понимаю, это потому, что a и b - это две разные ссылки на один и тот же объект (apple2e).
Из-за интернирования строк и только из-за интернирования строк a
и b
являются разными ссылками на один и тот же String
объект.
К сожалению, ваш код не делает то, что вы думаете, что он делает. Попробуйте это:
String a = "apple2e";
String b = "apple2e";
System.out.println("a==b? " + a == b); // "false"
System.out.println("a==b? " + (a == b)); // "a==b? true"
Java автоматически интернирует все строковые литералы. Это , поэтому второй sysout печатает, что он делает. Первый sysout печатает только "false"
, потому что конкатенация строк (+
) имеет более высокий приоритет, чем ==
, поэтому это эквивалентно этому:
System.out.println("a==b? apple2e" == "apple2e");
Не думаю, что вы это хотели проверить!
Это, с другой стороны, даст вам два отдельных String
экземпляра:
String a = new String("apple2e");
String b = new String("apple2e");
System.out.println("a==b? " + (a == b)); // "a==b? false"
Который схематически будет выглядеть
a (reference_id 123) --------------- "apple2e"
b (reference_id 456) --------------- "apple2e"
и может быть уменьшен до исходной ситуации с помощью String#intern()
:
String a = new String("apple2e").intern();
String b = new String("apple2e").intern();
System.out.println("a==b? " + (a == b)); // "a==b? true"
* * +1036 например,
a (reference_id 123) ------+
+--------- "apple2e"
b (reference_id 456) ------+