簡體   English   中英

從Java util列表讀取時,為什么所有元素都返回最后一個元素? (概括)

[英]When reading from a java util List, why do all elements return the last element? (generalized)

問題:為什么會打印以下內容:

ChildB___Parent of ChildB
ChildB___Parent of ChildB

而不是我認為應該打印出來的內容:

ChildA___Parent of ChildA
ChildB___Parent of ChildB

簡短的自包含的廣義發行示例:

import java.util.ArrayList;
import java.util.List;

public class StackExchangeQuestion1 {
public static void main(String[] args){
   List<String[]> list = new ArrayList();   
   String[] pair = {"childID","parentID"}; //for readability this gets overwritten       

//adding values to list
   pair[0] = "ChildA";
   pair[1] = "Parent of ChildA";
   list.add(pair);

   pair[0] = "ChildB";
   pair[1] = "Parent of ChildB";
   list.add(pair);

//checking values in list
   for(int i=0;i<list.size();i++){
   pair = list.get(i); //variable reuse for readability
   System.out.println(pair[0]+"___"+pair[1]);
   }
}}//end class and main

您將相同的String[]引用兩次添加到列表中。 因此,列表中的兩個元素都指向同一個對象。 因此,當您重寫數組時,實際上是在寫入同一塊內存。 該列表兩次引用該內存,因此您將獲得2個相同的打印語句。

Java將通過引用傳遞所有非原始值(這意味着它將傳遞一個指向非原始對象在內存中存儲的位置的指針。)

如果要存儲整數,則像這樣:

int a = 10;
list.add(a);
a = 20;
list.add(a);

一切都會好起來的,因為a是一個整數,整數是原始值,並且原始值按值傳遞 這意味着存儲在數據復制到列表中,而不是在內存中的點a在舉行。

但是,任何類型的字符串和數組都是非原始的。

為了修復您的代碼,您需要向列表傳遞2個單獨的引用:

String[] pair1 = {"ChildA","Parent of ChildA"};
String[] pare2 = {"ChildB", "Parent of ChildB"};
//adding values to list
list.add(pair1);
list.add(pair2);

編輯:

您曾在有關詳細程度的評論中表達過擔憂。 首先,我認為您的代碼並不冗長。 但是,如果您真的擔心它,可以使用以下方法將其縮短:

list.add(new String[]{"ChildA","Parent of ChildA"});
list.add(new String[]{"ChildB","Parent of ChildB"});

因為ArrayList存儲引用 ,而不存儲對象 引用pair始終引用同一對象。 您只需將該引用兩次添加到列表中即可。

您的字符串對象數組在這里被覆蓋。 您的最后一次更改僅會反映在您的字符串中,因為列表將存儲對象的引用。 如果要獲得假定的輸出,請在每次設置值之前創建新對象。

暫無
暫無

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

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