Javaで文字列と定数プールを作成する2つの方法

文字列を作成する2つの方法

1.絶え間ない創造:

String str1 = "abcd";

文字列定数を作成すると、JVMは最初に文字列定数プールをチェックします。文字列が定数プールにすでに存在する場合は、定数プール内のインスタンス参照を直接返します。文字列が定数プールに存在しない場合、文字列はインスタンス化され、定数プールに配置されます。文字列文字列は不変であるため、定数プールに2つの同一の文字列があってはならないことを確信できます。

上記のコード行は次のように理解できます。そこで文字列定数プールを確認し、"abcd"そうでない場合は文字列定数プールを作成str1して、オブジェクト文字列定数プールをポイントします。もしそうなら、直接str1ポイントに"abcd";

2.オブジェクトの作成:

String str2 = new String("abcd");//堆中创建一个新的对象
String str3 = new String("abcd");//堆中创建一个新的对象

この作成形式は、オブジェクトの作成形式と同じです。作成されたオブジェクトはヒープに格納され、スタックを指します。このため、str2およびstr3スタック、スタックポインタのメモリアドレス“abcd”と、str1文字列定数プールにメモリアドレスポイント。

これらの2つの異なる作成方法は異なります。

  1. 最初の方法は、定数プール内のオブジェクトを取得することです。
  2. 2番目の方法は、ヒープメモリスペースに直接新しいオブジェクトを作成することです。
System.out.println(str1==str2);//false
System.out.println(str2==str3);//false

1つ覚えておいてください。それを使用する限りnew、新しいオブジェクトを作成する必要があります。

別の画像は整理しやすいはずです(画像ソース:https//www.journaldev.com/797/what-is-java-string-pool

ここに画像の説明を挿入

 
 

文字列定数プール

文字列型の定数プールは特別です。それを使用する2つの主な方法があります:

  1. 二重引用符を使用して直接宣言された文字列オブジェクトは、定数プールに直接格納されます。
  2. 文字列オブジェクトが二重引用符で囲まれていない場合は、文字列を使用してinternメソッドを提供できます

補足:String.intern()

String.intern()ネイティブメソッドです。その役割は次のとおりです。

  1. ランタイム定数プールにこのStringオブジェクトの内容と等しい文字列がすでに含まれている場合、定数プール内の文字列への参照が返されます。
  2. そうでない場合、JDK1.7(1.7を含まない)より前の処理方法は、定数プールにこの文字列と同じ内容の文字列を作成し、定数プールに作成された文字列への参照を返すことです。JDK1.7以降の処理方法は、この文字列の参照を定数プールに記録し、その参照を返すことです。
String s1 = new String("计算机");
String s2 = s1.intern();
String s3 = "计算机";
System.out.println(s2);//计算机
System.out.println(s1 == s2);//false,因为一个是堆内存中的 String 对象一个是常量池中的 String 对象,
System.out.println(s3 == s2);//true,因为两个都是常量池中的 String 对象

 

少し知識のポイントを追加します:文字列のスプライシング:

String str1 = "str";
String str2 = "ing";
		 
String str3 = "str" + "ing";//常量池中的对象
String str4 = str1 + str2; //在堆上创建的新的对象	  
String str5 = "string";//常量池中的对象

System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false

複数の文字列を連結しないようにしてください。これにより、オブジェクトが再作成されます。文字列を変更する必要がある場合は、StringBuilderまたはStringBufferを使用できます。
 
 
ps:8つの基本的なタイプのパッケージングクラスと定数プールについて知りたい場合は、私の別のブログを参照できます:https
//blog.csdn.net/weixin_43901865/article/details/112566955

おすすめ

転載: blog.csdn.net/weixin_43901865/article/details/112782233