質問: 0) { addData.clear(); addData.put("fileName", registTnpFile.getBtrFilePath()); addData.put("size", registTnpFile.getFileSize()); addData.put("serial", registTnpFile.getFileSerialNo()); tnpFileNewdata.add(addData); } } ``` ### 補足説明 デバッグモードでステップ実行したところ ループの初回に到達したaddの時点では tnpFileNewdataの中身は [fileName=tnpfile_02.pdf, size=650, serial=002] 2回目のループではaddの行に到達する前に [fileName=tnpfile_03.pdf, size=700, serial=003] 上記に下記変わってました 参照値でもListに渡した後のList内でも変わってしまうものなのでしょうか 期待している値は [fileName=tnpfile_02.pdf, size=650, serial=002] [fileName=tnpfile_03.pdf, size=700, serial=003] になります。
回答: 回答: 同一のHashMapインスタンスに対して[clear]を行って格納情報を削除しているため。 全て別の要素にするならば、For文内で利用する都度インスタンス化しなければならない。 後蛇足ですが、JAVAの場合クラス名の1文字目は基本的に大文字にした方がいいです。 解説: 前提として、tnpList には tnpFileBean 型のインスタンスが3つ格納されているとします。 for文の外でHashMapをインスタンス化してます。 ``` Map addData = new HashMap(); ``` すると、HashMapのインスタンスが1つ生成されます。 コードの説明を入れますと、 ``` Map addData = new HashMap(); for (tnpFileBean registTnpFile : tnpList) { if (registTnpFile.getAlradyFlg() == 0) { // addDataには2週目以降、1つ前にputメソッドで追加した内容が含まれますが、 // 2週目の場合、tnpFileNamedataの0番目に格納したaddDataのインスタンスは // 同じインスタンスです。 // そのインスタンスの格納情報をclearメソッドにてクリアします。 // tnpFileNamedataの0番目に格納したaddDataのインスタンスは同じなので格納情報が消えます。 addData.clear(); addData.put("fileName", registTnpFile.getBtrFilePath()); addData.put("size", registTnpFile.getFileSize()); addData.put("serial", registTnpFile.getFileSerialNo()); tnpFileNewdata.add(addData); } } ``` 全部べつにしたければ、全て別のHashMapインスタンスを代入し直さなくてはならないので以下のような状態にしなくてはなりません。 ``` Map addData = null; for (tnpFileBean registTnpFile : tnpList) { if (registTnpFile.getAlradyFlg() == 0) { addData = new HashMap(); addData.put("fileName", registTnpFile.getBtrFilePath()); addData.put("size", registTnpFile.getFileSize()); addData.put("serial", registTnpFile.getFileSerialNo()); tnpFileNewdata.add(addData); } } ```