Это не обязательно правда. Пример:
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // true
но:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false
Теперь вторая форма не рекомендуется. Некоторые (включая меня) считают, что у String
не должно быть публичного конструктора. Лучшая версия выше была бы:
String s1 = new String("hello").intern();
String s2 = new String("hello").intern();
System.out.println(s1 == s2); // true
Очевидно, вам не нужно делать это для константы String
. Это иллюстративно.
Важным моментом в этом отношении является то, что если вы получили String
или получили его от функции, вы не можете полагаться на String
, являющуюся каноническим . канонический Object
удовлетворяет этому равенству:
a.equals(b) == b.equals(a) == (a == b)
для не null
экземпляров a
, b,
данного Class
.