コードで文字列リテラルを使用するたびに (場所に関係なく)、コンパイラはその文字列をシンボル テーブルに配置し、同じファイル内のどこかで同じ文字列に遭遇するたびにそれを参照します。後で、この文字列は定数プールに配置されます。その文字列を別のメソッドに渡すと、引き続き同じ参照が使用されます。文字列は不変であるため、安全に再利用できます。
次のプログラムを例に取ります。
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
定数プールには 2 つのエントリがあります。1 つはString
( #2
) 実際の文字 ( ) を参照するためのもの#19
です。