1

javaドキュメントによると:

最初は空の文字列のプールは、Stringクラスによってプライベートに維持されます。

1)それはこれらの文字列リテラルのプール string literals ですか ?referencesネット上では、文字列リテラルのプールとして参照している記事もあれば、参照のプールとして参照している記事もあるため、混乱しました。

2)文字列プールはクラスごとに作成されますか、それともJVMごとに作成されますか?

3)文字列プール、その実装などの詳細を見つけることができるリファレンスはありますか?

4

3 に答える 3

4

1)それは文字列リテラルのプールですか、それともこれらの文字列リテラルへの参照ですか?ネット上では、文字列リテラルのプールとして参照している記事もあれば、参照のプールとして参照している記事もあるため、混乱しました。

同じことです。参照なしでStringオブジェクトを作成することはできません。また、その逆も可能です。

そして、Peter Lawreyは次のように述べています。「Javaでは、オブジェクトはヒープ内にあります。他にはありません。オブジェクト、配列、コレクション、またはスタックなど、他のオブジェクト内に持つことができるのは、そのオブジェクトへの参照だけです。 。」

2)文字列プールはクラスごとに作成されますか、それともJVMごとに作成されますか?

JVMごとに1つの文字列プールがあります...別の方法で実装することを決定したエキゾチックなJVMを使用している場合を除きます。(仕様では、JVM用に1つの文字列プールが必要であるとは述べられていませんが、それが一般的に最も効果的な方法です。)

3)文字列プール、その実装などの詳細を見つけることができるリファレンスはありますか?

OpenJDK 6または7の完全なソースコードをダウンロードできます。スプリングプールはネイティブコードで実装されているため、C++を読むことになります。

于 2012-06-24T07:16:07.160 に答える
1
Is it a pool of string literals or references to these string literals?.

まあ、明らかにそれは文字列リテラルのプールです。あなたが書いたとします。

String str= "a learner";

同じ文字列が文字列プールにあるかどうか equals() メソッドで文字列プールを検索します。プールに同じ文字列がある場合はその文字列オブジェクトが返され、そうでない場合は文字列プールに格納され、新しく追加された文字列への参照が返されます。返されます。

したがって、これは String オブジェクトのプールであり、新しい文字列リテラルを入力するたびに equals() メソッドが呼び出されます。

Is string pool created per class basis or per JVM basis?

String クラスは final であるため、JVM には String のクラスが 1 つしか存在できません。したがって、JVM ごとに複数の String クラスが存在することに疑問の余地はありません。最終的には、JVM ごとに 1 つの文字列プールのみになります。

于 2012-06-24T06:37:02.250 に答える
0

これは文字列インターンと呼ばれます。

  1. 文字列リテラルのプールです
  2. インターンはJVMベースで行われます
  3. StringのJDKソースには、すべてのコードが含まれています
于 2012-06-24T06:30:06.297 に答える