そこに文字列定数プールには文字列がない、と私が言う場合ならば言ってやります、
String s = "Java";
次に、どのように多くのオブジェクトが作成されますか?
今プールで再び何も、と私は言って、
String s = new String("Java");
さて、どのように多くのオブジェクトが作成されますか?
今プールで再び何も、と私は言って、
String s = new String("Java"); s.intern();
インターン方法は何をしますか?
今プールで再び何も、と私は言って、
String s = new String("Java"); String s1 = s.intern();
今、何が起こるのだろうか?
私は本当にそれについて混乱していて答えてください。
私はあなたが新しいとの文字列を作成するとき、その2つのオブジェクトが作成されていることをSCJP5キャシーシエラ帳、プール内のヒープと一対一で読んで。
私は、各例では、新しいJVMたびに、正確に一度のコードをロードして実行を下回ることを前提としています。(私も、どこにも、あなたのコード内のリテラルを使用しないことを前提としています"Java"
...それは、物事を複雑になるため。)
文字列定数プールには文字列が存在しない場合1)と言う、と私は言うならば、
String s = "Java";
次に、どのように多くのオブジェクトが作成されますか?
メソッドがロードされたときに1つの文字列が作成され、プールに追加されます。
2)今、再びプールで何が、と私は言って、
String s = new String("Java");
今どのように多くのオブジェクトは作成されます。
メソッドがロードされたときに1つの文字列が作成され、プールに追加されます。
2番目の文字列をによって作成されnew
たコードが実行されると、それはプールに追加されていません。
3)今、再びプールで何が、と私は言って、
String s = new String("Java"); s.intern();
インターン方法は何をしますか?
メソッドがロードされたときに1つの文字列が作成され、プールに追加されます。
2番目の文字列をによって作成されnew
、それがプールに追加されていません。
intern
呼び出しは、最初の文字列を返します。(あなたは、参照を保持しません...)
4)今、再びプールで何が、と私は言って、
String s = new String("Java"); String s1 = s.intern();
今、何が起こるのだろうか?
実施例3と同様したがって、s1
参照保持するString
表すオブジェクト"Java"
文字列リテラル。
私はあなたと文字列を作成するときにすることをSCJP5キャシーシエラの本、読んで
new
、その後、2つのオブジェクトが作成され、プール内のヒープと一対一。
私は本がまさにそれを言ったことを疑います。(あなたは言い換えている、と私はあなたがやや不正確に言い換えていると思います。)
リテラルを表す文字列オブジェクトが作成され、コードの断片がロードされたときにプールに追加された(これは重要です!)にもかかわらずしかし、あなたの言い換えは、おおよそ正しい1を、それが実行されていないとき、。
そして、混乱の別のポイントに対処します:
「私は実際に何を意味するのか、あなたが与えた答えから、文字列は常に文字列定数プールに追加されるようだということでした。」
それは間違っています。それは偽の一般化です。
それは上記の例のすべての4のために真であるが、それは他人のために真ではありません。これは、元の文字列がどこから来たのかに依存します。典型的なアプリケーションでは、ほとんどのテキストデータは、ファイル、ソケット、またはユーザインターフェイスから読み込まれます。これが発生すると、文字列は、直接またはライブラリ呼び出しを介して、文字の配列から作成されます。
ここでは、単純な(しかし、非現実的)を示し、その構成要素の文字から文字列を作成する例です。
String s = new String(new char[]{'J', 'a', 'v', 'a'});
上記のスニペットでは、1つの文字列のみが作成され、それが文字列のプールではありません。あなたは結果の文字列を望んでいた場合、あなたがする必要がある文字列プールにあることを明示的に呼び出してintern
、このような何かを:
String s = new String(new char[]{'J', 'a', 'v', 'a'});
s = s.intern();
...(必要ならば)作成された第二の文字列プール内の文字列2。
1 -どうやら、いくつかのJVMの作成とインターン文字列リテラルで行われる遅延し、それが実際に起こったときに100%の確信を持って言うことはできません。しかし、それは一度だけ発生します(クラスごとにその参照リテラル)、コードフラグメントはJVMによって実行された回数に関係なく。
2 -に方法はありませんnew
文字列プールに文字列が。これは、実際にJLSの違反となります。new
操作は次のようにJLSによって指定され、常に新しいオブジェクトを作成します。