文字列、文字列定数プールと文字列のインターン方法について知っておく必要があります

RohitT:
  1. そこに文字列定数プールには文字列がない、と私が言う場合ならば言ってやります、

    String s = "Java";
    

    次に、どのように多くのオブジェクトが作成されますか?

  2. 今プールで再び何も、と私は言って、

    String s = new String("Java");
    

    さて、どのように多くのオブジェクトが作成されますか?

  3. 今プールで再び何も、と私は言って、

    String s = new String("Java");
    s.intern();
    

    インターン方法は何をしますか?

  4. 今プールで再び何も、と私は言って、

    String s = new String("Java");
    String s1 = s.intern();
    

    今、何が起こるのだろうか?

私は本当にそれについて混乱していて答えてください。

私はあなたが新しいとの文字列を作成するとき、その2つのオブジェクトが作成されていることをSCJP5キャシーシエラ帳、プール内のヒープと一対一で読んで。

スティーブンC:

私は、各例では、新しい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によって指定され、常に新しいオブジェクトを作成します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185755&siteId=1