4

そのため、紛らわしいコンストラクターに出くわしたとき、私は String クラスを読んでいました。コードは次のようになります

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    /** The value is used for character storage. */
    private final char value[];

    /** Initializes a newly created {@code String} object so that it represents
    * an empty character sequence.  Note that use of this constructor is
    * unnecessary since Strings are immutable.
    */
    public String() {
        this.value = "".value;
    }
// the rest of the class code
}

私は何を理解していません

"".value;

行う。これは何""ですか?それは新しいString objectですか?もしそうなら、どのコンストラクタで?

4

2 に答える 2

1

これは何ですか ""?それは新しい String オブジェクトですか?

空文字列です。文字列リテラルはインターンされているため、新しいものである必要はありません。

もしそうなら、どのコンストラクタで?

コンパイル時に、空の文字列ScannerおそらくString(char[], int, int).

実行時に、ClassLoaderはクラス ファイルから文字列をロードしてインターンし、おそらくjava_lang_String::create_from_unicode()および フレンドを介してネイティブ コードに格納します。

使用する理由について""は、メモリ使用の最適化です。文字列リテラルはインターンされ"".valueいるため、すべての空の文字列に対して同じ基になる char 配列への参照です。

リポジトリから、以前に使用されOpenJDK ( 7、8 ) 。ソースコードに出現するたびに、新しい char 配列オブジェクトが作成されました(つまり、決して発生しないことを願っています)。this.value = new char[0];new String()

現在の OpenJDK 9 には"".value.

この変更により、新しい char 配列の作成が防止されるため、インターンされていないが新しく作成された空の文字列ごとに数バイトが節約されます。変更後、長さゼロの文字列はすべて同じ (長さゼロ) char 配列を共有します。

どこかで使用したことがあるかどうか思い出せないので、これはまれなケースだと思いnew String()ます。

于 2016-05-14T11:51:50.180 に答える
0

""は aStringであり、したがって、char[] values任意のように a を持ちStringます。ただし、文字がないためvalues、空の配列になります。

基本的に、コードvaluesは空の配列に初期化されます。

于 2016-05-14T11:24:32.807 に答える