16

Java のすべての文字列リテラルは型の定数オブジェクトでありString、文字列リテラル プールに格納されます。

Stringメソッドに引数として渡されたリテラルもStringリテラル プールに格納されますか?

たとえば、私たちが書くとき、

System.out.println("Hello");

また

anyobj.show("Hello");

String「こんにちは」が作成され、リテラル プールに格納されますStringか?

文字列リテラル プールの内容を出力する方法はありますか?

4

3 に答える 3

22

コードで文字列リテラルを使用するたびに (場所に関係なく)、コンパイラはその文字列をシンボル テーブルに配置し、同じファイル内のどこかで同じ文字列に遭遇するたびにそれを参照します。後で、この文字列は定数プールに配置されます。その文字列を別のメソッドに渡すと、引き続き同じ参照が使用されます。文字列は不変であるため、安全に再利用できます。

次のプログラムを例に取ります。

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です。

于 2012-06-23T12:54:21.783 に答える
5

メソッドに引数として渡された文字列リテラルも文字列プールに格納されますか?

もちろん。なぜそれらが異なると期待するのですか?

于 2012-06-23T12:53:13.423 に答える
1

String リテラル プールの検査に関しては、@Puneet がそのためのツールを作成したようです。

于 2012-06-23T12:57:43.667 に答える