簡體   English   中英

第i個元素的值更改影響ArrayList第0個元素的值

[英]value change in ith element influences value in the 0th element for 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);
 }

但是,我發現我對ith元素進行了更改,第0元素也將其值更改為ith元素,但是我認為我沒有更改。 有人可以給我建議為什么會發生嗎?

首先謝謝。

根據到目前為止的描述和代碼,我認為只有兩個可能的(合理的)原因:

  • 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

如果兩種情況都不是,則您提供的代碼不足以找到導致異常行為的原因。

由於您的代碼不完整,因此我根據我的經驗進行回答。

您的List<QuestionaireResultDetail>是一個類型為QuestionaireResultDetail的對象的ArrayList。

現在, ArrayList存儲了對象。 因此,當您將一個對象添加到ArrayList時,實際上並不是創建一個副本對象,而是實際上是對原始對象的引用。 因此,一個對象的任何更改都將反映到該對象的所有副本中。

例如:

Object A= 12;
Object B=A;
B=10;

將A的值設為10。因為A和B指向相同的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM