私はJavaのStringのソースコードを経由して、私はいくつかの疑問を持っているCTORが見つかりました:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
私はオリジナルのリテラルとして機能していることが分かるString
(二重引用符付き)が、Java / JVMに計算されるかを理解することはできないoriginal.value
としてchar
アレイ。以上、ここで「値」とは何ですか?値がある場合char
アレイは、その後どのように.value
機能/フィールドが計算されます?
すべての言語のスクリプトを組み合わせることができるよう設計することにより、文字列は、Unicodeテキストを保持しています。実装は、配列(フィールド名を保持しているためvalue
、すべての文字が2バイトUTF-16の値です)。
あなたは、Javaクラスに1つ、私の知る限り唯一の愚かなポイントに遭遇しました。
図示コピーコンストラクタは、文字列は不変オブジェクトであるように、無意味であり、それらは単純な割り当てによって共有されてもよいです。それは多分文字列インターンに関連して、C ++の継承の化石です。
作るためにコピーすることは無意味です。これは、内部すぎ保持char
実際に参照することにより割り当てることができる配列、。(非常に必然的なわけではありません。)
次のショー経験の浅いJavaの使用量はそれほど:
String s = new String(t);
最新のJavaバージョンでは、文字列の値は、実際には、いくつかのエンコーディングのバイト配列かもしれない、従って文字をレイジー設けられています。
文字列リテラルについて:
文字列リテラルと呼ばれるの.classファイルにデータ構造に格納されている一定のプール。保存されたそれは、UTF-8バイトの通りです。JVMのClassLoaderは、文字列を文字列として読み込まれることを保証します。
輸入final static String
定数は、定数プールにコピーされ、元のクラスは、もはやからインポートされたものとして表示されなくてもよいです。もはやクラスの依存関係が存在しない可能性があるとして、他のクラスの文字列定数を保持することは、手動でクリーンビルドを実行する必要があります。