Java String解析
2759 ワード
Java String解析
1.Stringが可変オブジェクトである理由
まずStringは8つの基本データ型ではなく、Stringはオブジェクトです.
内部メンバー変数
Stringの内部はchar配列で実現され,valueはfinalタイプとして宣言され,初期化後にvalue値が変更できないことを示すことからStringが可変であることがわかる.
しかし、それは完全に可変ではなく、反射技術によってStringの値を変えることができるのは以下の通りである.
2.String str="test"とString str=new String("test")の違い;
String str=「test」字面量作成形成:
JVMは、文字列定数プールに同じ内容の文字列オブジェクトの参照が存在する場合、その参照を返します.そうでない場合、新しい文字列オブジェクトが作成され、その参照を文字列定数プールに入れ、その参照を返します.
String str=new String(「test」)が正常に作成されます
スタックにメモリが割り当てられ、スタックにリファレンスが割り当てられます.スタック:newから出てきたすべてのオブジェクトを格納する スタック:基本タイプの変数データとオブジェクトを格納アプリケーション.オブジェクト(newからのオブジェクト)自体はスタックには存在せず、スタックまたは定数プール(文字列定数オブジェクトは定数プールに格納) に格納される.定数プール:基本タイプ定数と文字列定数を格納します.
スタックと定数プール内のオブジェクトは共有できますが、スタック内のオブジェクトは共有できません.スタック内のデータサイズとライフサイクルは決定でき、参照がデータを指していない場合、このデータは自動的に消えます.スタック内のオブジェクトはゴミ回収器が回収を担当するため、サイズとライフサイクルを決定する必要がなく、柔軟性があります.
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」)が正常に作成されます
スタックにメモリが割り当てられ、スタックにリファレンスが割り当てられます.
スタックと定数プール内のオブジェクトは共有できますが、スタック内のオブジェクトは共有できません.スタック内のデータサイズとライフサイクルは決定でき、参照がデータを指していない場合、このデータは自動的に消えます.スタック内のオブジェクトはゴミ回収器が回収を担当するため、サイズとライフサイクルを決定する必要がなく、柔軟性があります.