⌚ 2016/6/10 (Fri) 🔄 2024/3/20 (Wed)
Mr.Sunの技術Tips「【for文に潜む罠!繰り返してるのに繰り返してない?!(Java初心者向け)】後編」
(前編はこちらをご参照ください)
今起きていることは「違う値を設定したはずなのに、同じ値になっている」。
何故そのような事が起きたのか?この後編で、そこを解明していきたいと思います。
ポイントはズバリ【アドレス】!
変数を定義するということは、「その型を入れる容れ物を用意して、名前をつける」ということです。
今回用意した容れ物は、
- beanListという名前のList<TestBean>
が入る容れ物 - beanという名前のTestBeanが入る容れ物
- strArrayという名前のString配列が入る容れ物
と、なります。
更に「変数に値を設定する」ということは、「名前をつけた容れ物に中身を入れる」・・・ということですよね。
ここに罠が潜んでいるとしたら・・・!?
「容れ物」には「容れ物」を置く場所が決まっている
名前をつけた容れ物には「アドレス」を割り当てなければなりません。そう、容れ物は「容れ物を置く場所(=アドレス)」が決まっているものなのです。つまり、
①beanListという名前のList<TestBean>
ソース解析:
List<TestBean> beanList = new ArrayList<TestBean>();
②
ソース解析:
TestBean bean = new TestBean();
③strArrayという名前のString配列が入る容れ物には、「それぞれの配列要素にそれぞれの文字列の場所(
つまり、
for (strArrayの配列要素の数だけ繰り返し) {
beanのitemAに、
beanListに、beanのアドレスを設定
}
という処理をしていた、ということになります。
for文が終わってbeanListの中身を出力すると、
修正方法はこれ!
【現状】
for (strArrayの配列要素の数だけ繰り返し) {
beanのitemAに、
beanListに、beanのアドレスを設定
}
【修正】
for (strArrayの配列要素の数だけ繰り返し) {
beanという名前の容れ物を新しく用意する(=
beanのitemAに、
beanListに、beanのアドレスを設定
}
と、すればよいのです。
いかがでしょう?
「for文の中で新規インスタンスの生成が必要な理由」が、よくお分かり頂けたのではないかと思います。
また今後も技術Tipsをお送りしたいと思いますので、宜しくお願いします。
Mr.SUN