Ответ 1
Каждый раз, когда вы используете строковый литерал в своем коде (независимо от того, где), компилятор помещает эту строку в таблицу символов и ссылается на нее каждый раз, когда встречает ту же строку где-то в одном файле, Позже эта строка будет помещена в постоянный пул. Если вы передаете эту строку другому методу, она по-прежнему использует ту же ссылку. Строка является неизменной, поэтому ее можно повторно использовать.
Возьмите эту программу в качестве примера:
public class Test {
public void foo() {
bar("Bar");
}
public void bar(String s) {
System.out.println(s.equals("Bar"));
}
}
После декомпиляции с javap -c -verbose
вы узнаете следующее:
const #2 = String #19; // Bar
//...
const #19 = Asciz Bar;
public void foo();
//...
1: ldc #2; //String Bar
public void bar(java.lang.String);
//...
4: ldc #2; //String Bar
В константном пуле есть две записи: одна для String
(#2
), ссылающаяся на действительные символы (#19
).