ith元素中的值更改会影响ArrayList的第0个元素中的值

时间:2014-03-31 08:41:29

标签: java arraylist

我有以下代码通过迭代设置值。

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个元素,但我不认为我改变了它。有人可以给我一些关于为什么会发生这种情况的建议吗?

先谢谢。

2 个答案:

答案 0 :(得分:1)

基于到目前为止的描述和代码,我认为只有两种可能的(合理的)原因:

  • i 项目与 0 项目相同
  • 涉及静态变量

第一个可能发生,例如,列表填充如下:

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指向相同的位置。