gpt4 book ai didi

java - 从 java util List 读取时,为什么所有元素都返回最后一个元素? (广义)

转载 作者:行者123 更新时间:2023-11-29 07:07:53 25 4
gpt4 key购买 nike

问题:为什么会打印出以下内容:

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[] 引用添加到您的列表中两次。因此,列表中的两个元素都指向同一个对象。所以,当你覆盖你的数组时,你实际上是在写入同一 block 内存。该列表引用了这 block 内存两次,因此您会得到 2 个相同的打印语句。

Java 将通过引用传递所有非原始值(这意味着它将传递指向非原始对象在内存中存储位置的指针。)

如果你像这样存储整数:

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

一切都会好起来的,因为 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"});

关于java - 从 java util List 读取时,为什么所有元素都返回最后一个元素? (广义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com