Java String解析

2759 ワード

Java String解析
1.Stringが可変オブジェクトである理由
まずStringは8つの基本データ型ではなく、Stringはオブジェクトです.
内部メンバー変数
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0
    }

Stringの内部はchar配列で実現され,valueはfinalタイプとして宣言され,初期化後にvalue値が変更できないことを示すことからStringが可変であることがわかる.
しかし、それは完全に可変ではなく、反射技術によってStringの値を変えることができるのは以下の通りである.
  String count = new String("1");

        Class> stringClass = Class.forName("java.lang.String");

        Field field =stringClass.getDeclaredField("value");
        //         
        field.setAccessible(true);
        //    
        char[] test = (char[])field.get(count);

        //  
        test[0]='2';

        //count    2
        System.out.println(count.toString());

2.String str="test"とString str=new String("test")の違い;
String str=「test」字面量作成形成:
JVMは、文字列定数プールに同じ内容の文字列オブジェクトの参照が存在する場合、その参照を返します.そうでない場合、新しい文字列オブジェクトが作成され、その参照を文字列定数プールに入れ、その参照を返します.
String str=new String(「test」)が正常に作成されます
スタックにメモリが割り当てられ、スタックにリファレンスが割り当てられます.
  • スタック:newから出てきたすべてのオブジェクトを格納する
  • スタック:基本タイプの変数データとオブジェクトを格納アプリケーション.オブジェクト(newからのオブジェクト)自体はスタックには存在せず、スタックまたは定数プール(文字列定数オブジェクトは定数プールに格納)
  • に格納される.
  • 定数プール:基本タイプ定数と文字列定数を格納します.

  • スタックと定数プール内のオブジェクトは共有できますが、スタック内のオブジェクトは共有できません.スタック内のデータサイズとライフサイクルは決定でき、参照がデータを指していない場合、このデータは自動的に消えます.スタック内のオブジェクトはゴミ回収器が回収を担当するため、サイズとライフサイクルを決定する必要がなく、柔軟性があります.