Для начала: "t" + "e"
- это строковый литерал, потому что он будет оптимизирован компилятором. Этот строковый литерал также используется в этой строке:
String a = new String("te");
Теперь конструктор String(String)
создает физическую копию строки. Таким образом, это означает, что a
и d
являются не одним и тем же объектом.
Тогда: String.equals(String)
сравнивает две строки. Он говорит, что содержимое 1016 * было равно, а не объект. Это означает, что у вас может быть два разных объекта String, которые имеют одинаковую последовательность символов, что приведет к возврату String.equals(String)
true
.
String.intern()
помещает строку в пул строк, если ее еще нет. Но этот метод не может изменить сам объект. Таким образом, этот пример кода выведет false:
String literal = "lit";
String nonLiteral = "abclit".substring(3); // equals "lit"
nonLiteral.intern(); // "lit" was already in the String pool
// but `nonLiteral` is still `nonLiteral`
System.out.println(literal == nonLiteral); // false
Однако, если вы сделаете это: он вернет true:
String literal = "lit";
String nonLiteral = "abclit".substring(3); // equals "lit"
nonLiteral = nonLiteral.intern(); // "lit" was already in the String pool and
// it will return the object `literal`.
// Now the value is replaced.
System.out.println(literal == nonLiteral); // true