文字列型の参照
目次
値型と参照型
値型(基本型/プリミティブ型)
Size s1 = new Size(width: 100);
Size s2 = s1;
size1とsize2は独立しており、
size1.width を変更してもsize2.width はそのまま
(※C#)
参照型(オブジェクト型)
Pen pen1 = new Pen(width: 100);
Pen pen2 = pen2;
pen2はpen1を参照しており、
pen1.width を変更すると、pen2.width も変わる。
(※C#)
Stringクラス
リテラル
ソースコードに直接記述された変数、定数以外の値。
リテラル領域という変数等とは異なるメモリ領域に作成される。
「プログラム言語 変数/リテラル」参照
String型変数へのリテラル格納
String型変数を宣言&値を設定すると、
(1) リテラル領域にリテラルが作成される
(2) Stringクラスのインスタンスが作成される
(3) (2)は(1)を参照する
という処理が行われる。
String s1 = "aaa";
String s2 = "aaa";
値(文字の並び)の比較
s1.equals(s2) : true
参照値の比較
(s1 == s2) : true
newした場合
インスタンス毎に別のリテラルが作成&参照される。
無駄。C#ではStringクラスのコンストラクタは無い。
String s1 = new String("aaa");
String s2 = new String("aaa");
値(文字の並び)の比較
s1.equals(s2) : true
参照値の比較
(s1 == s2) : false
Stringオブジェクトの参照値を変更した場合の影響
Stringオブジェクトのコピー
String s1 = "aaa";
String s2 = s1;
s2はリテラル領域を直接参照する。
値(文字の並び)の比較
s1.equals(s2) : true
参照値の比較
(s1 == s2) : true
↓
s1 = "bbb"
(1) リテラル領域に新しいリテラルが作成される
(2) s1は(1)を参照する
※s2はそのまま
値(文字の並び)の比較
s1.equals(s2) : false
参照値の比較
(s1 == s2) : false
newしたStringオブジェクトの場合
同じ