文字列型の参照

値型と参照型

値型(基本型/プリミティブ型)

val-ref1
Size s1 = new Size(width: 100);
Size s2 = s1;
size1とsize2は独立しており、
size1.width を変更してもsize2.width はそのまま
(※C#)

参照型(オブジェクト型)

val-ref2
Pen pen1 = new Pen(width: 100);
Pen pen2 = pen2;
pen2はpen1を参照しており、
pen1.width を変更すると、pen2.width も変わる。
(※C#)

Stringクラス

リテラル

ソースコードに直接記述された変数、定数以外の値。
リテラル領域という変数等とは異なるメモリ領域に作成される。
プログラム言語 変数/リテラル」参照

String型変数へのリテラル格納

val-ref3
String型変数を宣言&値を設定すると、
(1) リテラル領域にリテラルが作成される
(2) Stringクラスのインスタンスが作成される
(3) (2)は(1)を参照する
という処理が行われる。
String s1 = "aaa";
String s2 = "aaa";
値(文字の並び)の比較
s1.equals(s2) : true
参照値の比較
(s1 == s2) : true

newした場合

val-ref4
インスタンス毎に別のリテラルが作成&参照される。
無駄。C#ではStringクラスのコンストラクタは無い。
String s1 = new String("aaa");
String s2 = new String("aaa");
値(文字の並び)の比較
s1.equals(s2) : true
参照値の比較
(s1 == s2) : false

Stringオブジェクトの参照値を変更した場合の影響

Stringオブジェクトのコピー

val-ref5
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オブジェクトの場合

val-ref6
同じ