Javaでのコピー(Javaの落とし穴)
投稿者: M.K
日付: 2007-09-26 23:58
日付: 2007-09-26 23:58
下記Gさんの過去メールを抜粋
新緑の萌ゆる季節なゴールデンウィーク。
皆様、如何お過ごしでしょうか。
皆様、如何お過ごしでしょうか。
お疲れ様です、Gです。
小職、GW全部出勤でかなーりブルーなわけですが。
小職、GW全部出勤でかなーりブルーなわけですが。
まぁ、それはそれとして、掲題の件なのですが
経緯としては最近、新人さんに教える機会が増えました。
新人さんは色々と興味深い話題を提供してくれますので、
話題に困りません。
経緯としては最近、新人さんに教える機会が増えました。
新人さんは色々と興味深い話題を提供してくれますので、
話題に困りません。
今回はその1つでございます。
ネタとしては、「=」は必ずしも値のコピーとはなりえない。
という話題でございます。以下はJavaソース。
その1では数値に対して「=」を行った場合の動作。
その2では日付オブジェクトに対して「=」を行った場合の動作。
その3では配列に対して「=」を行った場合の動作です。
という話題でございます。以下はJavaソース。
その1では数値に対して「=」を行った場合の動作。
その2では日付オブジェクトに対して「=」を行った場合の動作。
その3では配列に対して「=」を行った場合の動作です。
- その1では「=」でつないだ後、変数bの値を変更しても変数aの値は保持されます。
- その2、その3ではdTest1、array1の値を変更していないにも関わらず、
dTest2、array2の値を変更した際に値が勝手に書き換わっている事が分かります、はい。
じゃぁ、どうすればできるんだという人のためにdTest3、array3を一例として示しておきます。
Javaプログラマがよくぶち当たる落とし穴でした。
不具合埋め込まないように気をつけましょう・・・プログラムってメンドクセ('Д`)
Javaプログラマがよくぶち当たる落とし穴でした。
不具合埋め込まないように気をつけましょう・・・プログラムってメンドクセ('Д`)
ご不明な点、間違ってるとこなどありましたら解説、土下座しますので
Gまでどうぞ。
Gまでどうぞ。
●下記Javaソースの実行結果
a:1
b:2
1回目dTest1:Tue Apr 24 10:02:05 JST 2007
1回目dTest2:Tue Apr 24 10:02:05 JST 2007
1回目dTest3:Tue Apr 24 10:02:05 JST 2007
2回目dTest1:Fri Apr 24 10:02:05 JST 3007
2回目dTest2:Fri Apr 24 10:02:05 JST 3007
2回目dTest3:Tue Apr 24 10:02:05 JST 4007
1回目array1:リンゴ:みかん:いも
1回目array2:リンゴ:みかん:いも
1回目array3:リンゴ:みかん:いも
2回目array1:トラ:ライオン:トナカイ
2回目array2:トラ:ライオン:トナカイ
2回目array3:ばば:いのき:えのき
a:1
b:2
1回目dTest1:Tue Apr 24 10:02:05 JST 2007
1回目dTest2:Tue Apr 24 10:02:05 JST 2007
1回目dTest3:Tue Apr 24 10:02:05 JST 2007
2回目dTest1:Fri Apr 24 10:02:05 JST 3007
2回目dTest2:Fri Apr 24 10:02:05 JST 3007
2回目dTest3:Tue Apr 24 10:02:05 JST 4007
1回目array1:リンゴ:みかん:いも
1回目array2:リンゴ:みかん:いも
1回目array3:リンゴ:みかん:いも
2回目array1:トラ:ライオン:トナカイ
2回目array2:トラ:ライオン:トナカイ
2回目array3:ばば:いのき:えのき
●以下ソース
int a = 1;
int b = a;
int b = a;
b = 2;
System.out.println("a:" + a);
System.out.println("b:" + b);
System.out.println("b:" + b);
java.util.Date dTest1 = new java.util.Date();
java.util.Date dTest2;
java.util.Date dTest3;
java.util.Date dTest2;
java.util.Date dTest3;
dTest2 = dTest1;
dTest3 = (Date) dTest1.clone();
System.out.println("1回目dTest1:" + dTest1);
System.out.println("1回目dTest2:" + dTest2);
System.out.println("1回目dTest3:" + dTest3);
System.out.println("1回目dTest2:" + dTest2);
System.out.println("1回目dTest3:" + dTest3);
dTest2.setYear(1107);
dTest3.setYear(2107);
dTest3.setYear(2107);
System.out.println("2回目dTest1:" + dTest1);
System.out.println("2回目dTest2:" + dTest2);
System.out.println("2回目dTest3:" + dTest3);
System.out.println("2回目dTest2:" + dTest2);
System.out.println("2回目dTest3:" + dTest3);
String[] array1 = {"リンゴ", "みかん\", "いも\"};
String[] array2;
String[] array3 = {"", "", ""};
String[] array2;
String[] array3 = {"", "", ""};
array2 = array1;
System.arraycopy(array1, 0, array3, 0, 3);
System.out.println("1回目array1:" + array1[0] + ":" + array1[1] + ":" + array1[2]);
System.out.println("1回目array2:" + array2[0] + ":" + array2[1] + ":" + array2[2]);
System.out.println("1回目array3:" + array3[0] + ":" + array3[1] + ":" + array3[2]);
System.out.println("1回目array2:" + array2[0] + ":" + array2[1] + ":" + array2[2]);
System.out.println("1回目array3:" + array3[0] + ":" + array3[1] + ":" + array3[2]);
array2[0] = "トラ\";
array2[1] = "ライオン\";
array2[2] = "トナカイ";
array2[1] = "ライオン\";
array2[2] = "トナカイ";
array3[0] = "ばば";
array3[1] = "いのき";
array3[2] = "えのき";
array3[1] = "いのき";
array3[2] = "えのき";
System.out.println("2回目array1:" + array1[0] + ":" + array1[1] + ":" + array1[2]);
System.out.println("2回目array2:" + array2[0] + ":" + array2[1] + ":" + array2[2]);
System.out.println("2回目array3:" + array3[0] + ":" + array3[1] + ":" + array3[2]);
System.out.println("2回目array2:" + array2[0] + ":" + array2[1] + ":" + array2[2]);
System.out.println("2回目array3:" + array3[0] + ":" + array3[1] + ":" + array3[2]);