String.intern()を使用して要約

ランボー

次のコードを見てください:

String s = new String("1");
String s1 = s.intern();
System.out.println(s == s1);
复制代码
打印结果为:
false
复制代码

ためのnew String("1")型文字列オブジェクト、2つのオブジェクトが作成され、それに格納されたJavaヒープ他方が一定の文字列オブジェクトであり、「1」、それに格納された文字列定数プールの。s.intern()最初のプールに行く方法は、文字列定数文字列定数オブジェクトが存在するかどうかを調べるには、「1」、それが「1」の文字列定数オブジェクトになるために生の文字列定数プールに存在しない場合、オブジェクトのアドレスは、返されたがある場合およびオブジェクトのアドレスを返します。図は次のとおりです。

image.png
可変 s オブジェクトStirng変数の型を指し s1 、「1」定数文字列オブジェクトを指し、 s == s1 結果は偽です。

ダブルキル

上記に基づき、私たちはその後、S2を定義し、次のとおりです。

String s = new String("1");
String s1 = s.intern();
String s2 = "1";
System.out.println(s == s1);
System.out.println(s1 == s2); // true
复制代码

s1 == s2以下に示すように、それは、一定の変数s2の文字列に直接真です。

image.png

トリプルキル

次のように我々は、定義されたT ON上記に基づいて:

String s = new String("1");
String t = new String("1");
String s1 = s.intern();
String s2 = "1";
System.out.println(s == s1);
System.out.println(s1 == s2);
System.out.println(s == t);   // false
System.out.println(s.intern() == t.intern());   // true
复制代码

s == t偽である、変数tと変数sはString型の2つの異なるオブジェクトを指していることは明らかです。s.intern() == t.intern()同じインターンメソッドは、文字列定数プール「1」オブジェクトを返す真であるので、それは、本当です。

image.png

ウルトラキル

上記に基づき、私たちはその後、S3を定義し、次のようにxは以下のとおりです。

String s = new String("1");
String t = new String("1");
String x = new String("1") + new String("1");
String s1 = s.intern();
String s2 = "1";
String s3 = "11";
System.out.println(s == s1);
System.out.println(s1 == s2);
System.out.println(s == t);
System.out.println(s.intern() == t.intern());
System.out.println(x == s3);  // fasle
System.out.println(x.intern() == s3.intern());  // true
复制代码

変数xがあるため、タイプStringの2つのオブジェクトが追加されx != s3呼び出し、それは確かにX列定数を指していない、xが実際にString型のオブジェクトであるx.intern()方法は、文字列定数に対応する「11」を返し、それがx.intern() == s3.intern()真であります。

大暴れ

次のように上記のコードは簡素化し、いくつかの変数を追加します。

String x = new String("1") + new String("1");
String x1 = new String("1") + "1";
String x2 = "1" + "1";
String s3 = "11";

System.out.println(x == s3);  // false
System.out.println(x1 == s3);  // false
System.out.println(x2 == s3); // true
复制代码

x == s3文字列定数にS3、String型Xのオブジェクトを指すようにはFalse; x1 == s3;文字列定数にS3、String型×1のオブジェクトを指すように偽のx2 == s3文字列定数にS3、文字列定数にX2にはtrue。

だから我々はそれを見ることができnew String("1") + "1"String型のオブジェクトが返されます。

概要

今、私たちはインターンメソッドは文字列定数プールを保存するためのプロセスでは、定数プールに文字列を保存することです知っている最初の文字列を直接使用した場合と同じ文字列定数プールがすでに存在しているかどうかを確認します。我々はビジネスのコードを書くときに、我々はそのような使用などの文字列の文字列定数プールを使用するようにしてくださいString s = "1";を使用するよりもnew String("1");より経済的なメモリ。また、使用することができString s  = 一个String类型的对象.intern();ますが、String型のオブジェクトを受け取ったときに、このような慣行が使用され、間接的な文字列定数を使用する方法を、ケースにはメモリを節約したい、もちろん、あなたは文字列sをString型のオブジェクトを=することができます。しかし、これを参照して、変数Sがあるため、String型の影響ガベージコレクションオブジェクトであってもよいです。だから我々は、インターンを最適化するための方法を使用しますが、それは注意することができますintern方法は、文字列定数プールがあるかどうかを確認する必要があるため、メモリを節約することができますが、スピードに影響します。

あなたはこの記事はあなたが知識を習得することができます見つけた場合、あなたは助けることができ、前方の知識は、共有アウト。あなたが最初の時間は、よりエキサイティングなコンテンツを学びたい場合は、してくださいに焦点を当てたマイクロチャネル公共数:1時25分

おすすめ

転載: juejin.im/post/5d0ccfe6e51d45773e418a92