順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

Javaでちょっと気になったこと

新人3ヵ月目の時、よく理解していなかったが故にやってしまったこと。

例えばユーザ情報をListに入れるときに

package test.java;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<UserBean> list = new ArrayList<UserBean>();

		UserBean uBean = new UserBean();

		/* 1人目 */
		uBean.setNo("1");
		uBean.setName("YoneSan");
		uBean.setMsg("MSG1");

		/* リストに追加 */
		list.add(uBean);

		/* 2人目 */
		uBean.setNo("2");
		uBean.setName("OzekiStyle");
		uBean.setMsg("MSG2");

		/* リストに追加 */
		list.add(uBean);

		/* 3人目 */
		uBean.setNo("3");
		uBean.setName("NagasawaKun");
		uBean.setMsg("MSG3");

		/* リストに追加 */
		list.add(uBean);

		for(UserBean ub : list){

			System.out.println(ub.getNo());
			System.out.println(ub.getName());
			System.out.println(ub.getMsg());

		}
	}

}

想定していた出力は

1
YoneSan
MSG1
2
OzekiStyle
MSG2
3
NagasawaKun
MSG3

こんな感じだけど、実際に実行すると。

3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3

一番最後に設定した値が出力される。

そりゃあインスタンスが1つ(newが1回)しか生成
されていないのにそのインスタンスに対して値を変更したら
すでにリストに格納されているものも変わるよなって話。

試しにハッシュコードを調べてみる。

package test.java;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<UserBean> list = new ArrayList<UserBean>();

		UserBean uBean = new UserBean();
		System.out.println(uBean);

		/* 1人目 */
		uBean.setNo("1");
		uBean.setName("YoneSan");
		uBean.setMsg("MSG1");

		/* リストに追加 */
		list.add(uBean);

		System.out.println(uBean);

		/* 2人目 */
		uBean.setNo("2");
		uBean.setName("OzekiStyle");
		uBean.setMsg("MSG2");

		/* リストに追加 */
		list.add(uBean);

		System.out.println(uBean);

		/* 3人目 */
		uBean.setNo("3");
		uBean.setName("NagasawaKun");
		uBean.setMsg("MSG3");

		/* リストに追加 */
		list.add(uBean);

		for(UserBean ub : list){

			System.out.println(ub.getNo());
			System.out.println(ub.getName());
			System.out.println(ub.getMsg());

		}
	}

}

出力結果↓
test.java.UserBean@659e0bfd
test.java.UserBean@659e0bfd
test.java.UserBean@659e0bfd
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3
3
NagasawaKun
MSG3

@以降がハッシュコードを指してる。

ハッシュコードはオブジェクトの内部アドレスを整数値にしたもの
みたいなので、すべて同じところを指していることが分かる。

参考↓
Object (Java Platform SE 7)

なので値を設定する前にインスタンスを生成すればOK。

package test.java;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<UserBean> list = new ArrayList<UserBean>();

		UserBean uBean = new UserBean();
		System.out.println(uBean);

		/* 1人目 */
		uBean.setNo("1");
		uBean.setName("YoneSan");
		uBean.setMsg("MSG1");

		/* リストに追加 */
		list.add(uBean);

		uBean = new UserBean();
		System.out.println(uBean);

		/* 2人目 */
		uBean.setNo("2");
		uBean.setName("OzekiStyle");
		uBean.setMsg("MSG2");

		/* リストに追加 */
		list.add(uBean);

		uBean = new UserBean();
		System.out.println(uBean);

		/* 3人目 */
		uBean.setNo("3");
		uBean.setName("NagasawaKun");
		uBean.setMsg("MSG3");

		/* リストに追加 */
		list.add(uBean);

		for(UserBean ub : list){

			System.out.println(ub.getNo());
			System.out.println(ub.getName());
			System.out.println(ub.getMsg());

		}
	}

}

出力結果↓
test.java.UserBean@659e0bfd
test.java.UserBean@2a139a55
test.java.UserBean@15db9742
1
YoneSan
MSG1
2
OzekiStyle
MSG2
3
NagasawaKun
MSG3

ハッシュコードも別々で想定した出力になっている。
これでインスタンスの理解が少し深まったかも。