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