我有以下代码通过迭代设置值。
for (int i=0; i<list.size(); i++){
QuestionaireResult item = list.get(i);
List<QuestionaireResultDetail> rsDetails = item.getQuestionaireResultDetails();
List<QuestionaireResultDetail> filledList = fillList2(rs.getQuestionaireResultDetails(), rsDetails);
item.setQuestionaireResultDetails(insertCommentObj3(insertCommentObj3(filledList, "C"), "B"));
QuestionaireResultDetail qr2 = new QuestionaireResultDetail();
qr2.setAnswerDesc(item.getRemark());
item.getQuestionaireResultDetails().add(qr2);
list.set(i, item);
}
然而,我发现我在第i个元素中进行了更改,第0个元素也将其值更改为第i个元素,但我不认为我改变了它。有人可以给我一些关于为什么会发生这种情况的建议吗?
先谢谢。
答案 0 :(得分:1)
基于到目前为止的描述和代码,我认为只有两种可能的(合理的)原因:
第一个可能发生,例如,列表填充如下:
List<Item> list = new ArrayList<Item>();
Item item = new Item();
for (int i=0; i<3; i++)
{
item.setSomeProperty(i);
list.add(item);
}
在这种情况下,您应确保为列表的每个条目创建新项:
List<Item> list = new ArrayList<Item>();
// Item item = new Item(); // Don't create a single instance here
for (int i=0; i<3; i++)
{
Item item = new Item(); // Instead, always create a new instance
item.setSomeProperty(i);
list.add(item);
}
第二个可能涉及一些静态变量,如本例
class Item
{
private static int someProperty;
public void setSomeProperty(int i)
{
someProperty = i;
}
}
在这种情况下,您只需确保该字段不是static
。
如果两者都不是这种情况,那么您提供的代码不足以找到奇怪行为的原因。
答案 1 :(得分:0)
由于您的代码不完整,我根据自己的经验回答。
您的List<QuestionaireResultDetail>
是类型为QuestionaireResultDetail
的对象的数组列表。
现在ArrayList
存储了对象。因此,当您向ArrayList添加一个对象时,它不会实际创建一个副本Object,它实际上是对原始对象的引用。因此,One对象中的任何更改都将反映到该对象的所有副本。
例如:
Object A= 12;
Object B=A;
B=10;
将A的值设为10.因为A和B指向相同的位置。