java基礎のStering知識の総括


一、概念
Stringは文字列を表し、java言語における二重引用符の文字列はすべてStringの対象であり、newの対象であるかどうかにかかわらず。
二、特徴
1.String類はfinalで修飾されているので、継承されません。注意してください。最初は文字列が変更できないと思っていましたが、finalで修飾されているので、実際にはそうではありません。Stringの下の階はchar配列で保存されています。finalで修飾されていますが、アドレスを変更することはできません。文字列を変更することはできませんので、finalで修飾されているかどうかは関係ありません。
2.文字列は変更できませんので、共有して使用できます。
3.文字列の下にchar[]配列を使って保存します。
三、三種類の構造方式:
1.public String():空の文字列オブジェクトを作成する
2.public String(char[]array):char配列を使って文字列を作成する
3.public String(byte[]array):byte配列を使って文字列を作成すると、このように対応する数字をASCIIコードに従って文字に変換します。97の代表文字aのように。
直接作成:String str="abc"
四、文字列定数池
jdk 1.6およびそれ以前に、文字列定数プールはメソッドエリア内にあり、jdk 1.7およびその後文字列定数プールはメソッドエリアから分離され、蓄積されている。
jdk 1.6とjdk 1.7の同じ点:
1.ダブルクォーテーションマークで文字列を作成し、JVM運転時は文字列定数プールに直接文字列オブジェクトを作成しますが、スタック内でオブジェクトを作成しません。
2.new一つの文字列オブジェクト(String s=new String(abc))は、二つのオブジェクトの作成に関連し、一つは積み重ねオブジェクト、一つは文字列常量池のオブジェクト(「abc」はダブル引用符を使用している)であり、文字列常量池がその文字列と同じオブジェクト(ここでは内容が同じで、住所ではない)がある場合は、一つのオブジェクトを作成する必要があります。文字列定数プールに同じオブジェクトがない場合は、文字列定数プールとヒープ内でオブジェクトを作成します。この2つのオブジェクトの間には参照が存在しません。つまり、オブジェクトの1つが保存されている値は別のオブジェクトのアドレスです。

String test1 = "test";
        String test3 = "test";
        String test2 = new String("test");
    
        System.out.println(test1 == test2);//false
        System.out.println(test1 == test3);//true
最初の出力はfalseであり、test 1は文字列常量池のオブジェクトであり、test 2はスタック中のオブジェクトであるため、彼らのアドレスは等しくないので、結果はfalseである。二つ目の出力はtrueです。ダブルクォーテーションマークで文字列を作成すると、まず文字列定数プールに行って、同じ値のオブジェクトが存在するかどうかを調べます。存在する場合はそのまま参照アドレスに戻ります。存在しない場合はオブジェクトを作成するため、test 1とtest 3は同じアドレスを指します。
jdk 1.6とjdk 1.7の違い:
jdk 1.6の文字創常池はオブジェクトであり、jdk 1.7文字常量池にはオブジェクトを記憶することができ、またオブジェクトの参照を記憶することができる。
もう一つ明確な点が必要です。
引用符を使用してテキストを含むように作成されたStringオブジェクトの間に「+」接続を使用して生成された新しいオブジェクトが文字列プールに追加されます。new方式を含むすべての新しいオブジェクト(nullを含む)に対する「+」接続表現は、新しいオブジェクトが文字列プールに追加されません。

String s6 = new String("go") +new String("od");
        String s7 = s6.intern();
        String s8 = "good";
        System.out.println(s6 == s7);//true
        System.out.println(s7 == s8);//true
        System.out.println(s6 == s8);//true
右の上の説明によると、s 6は積み上げ中の文字列goodオブジェクトのアドレスを指しており、このオブジェクトは文字列定数プールに作成されておらず、Stering s 7=s 6.intern()に実行されると、の場合、文字創常量池にはこのオブジェクトがなく、そのオブジェクトがスタックに存在するため、文字列定数池に参照先の山の中のオブジェクトが作成されますので、s 6とs 7は同じオブジェクトを指します。jdk 1.6であれば、直接文字列常量池にオブジェクトを作成して、このオブジェクトの参照に戻ります。ここでs 6とs 7は異なるオブジェクトを指します。

 String s2 = new String("lo") + new String("ng");
        String s3 =  s2.intern();
        System.out.println(s2 == s3);//false
ここでは上の分析に基づいてtrueに戻るべきですが、ここでfalseに戻ります。理由は以下の通りです。
在这里插入图片描述
ここでjava基礎のString知識についてまとめた文章を紹介します。Java Stringに関する内容は以前の文章を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。