Java 为什么我的ArrayList的ArrayList值在我设置它们之后会发生更改?

Java 为什么我的ArrayList的ArrayList值在我设置它们之后会发生更改?,java,arraylist,java-8,iteration,Java,Arraylist,Java 8,Iteration,不幸的是,我正在使用ArrayList of ArrayList of ArrayList of ArrayList。我对Java非常陌生,所以这可能是我的一个简单错误(我习惯Perl)。我正在对一些代码进行故障排除,在这些代码中,我构建了空ArrayList ^4的完整结构(它表示固定数量的数据字段,这些字段从不更改,但具有修改过的值),然后尝试摄取一个文件,使用ArrayList.get()和ArrayList.set()设置嵌套值。下面是代码——从文件中读入行(到ArrayList行中),

不幸的是,我正在使用ArrayList of ArrayList of ArrayList of ArrayList。我对Java非常陌生,所以这可能是我的一个简单错误(我习惯Perl)。我正在对一些代码进行故障排除,在这些代码中,我构建了空ArrayList ^4的完整结构(它表示固定数量的数据字段,这些字段从不更改,但具有修改过的值),然后尝试摄取一个文件,使用ArrayList.get()和ArrayList.set()设置嵌套值。下面是代码——从文件中读入行(到ArrayList行中),并迭代以逐段添加到ArrayList ^4(称为DB)

读入“lines”ArrayList的输入数据的一般格式大致如下——很抱歉,这对眼睛来说很难。每个0可以是任意字符串:

ID  0.0-0.0 0.0-0.0 0.0-0.0 0.0-0.0 0.0-0.0
DB是最终的ArrayList ^4,四个嵌套的数组列表,它们都包含一定数量的占位符字符串。它是通过依次将0的ArrayList添加到ArrayList ^2,然后将这些数组列表添加到ArrayList ^3(即添加到DB的行)来构建的。输入数据被各种分隔符分解,并用于替换这些占位符字符串

ArrayList<String> Single = new ArrayList<String>();
    for(int i = 0; i < 2; i++) {
        Single.add("0"); }

ArrayList<ArrayList<String>> Squared = new ArrayList<ArrayList<String>>();
    Squared.add(Single);
    Squared.add(Single);

ArrayList<ArrayList<ArrayList<String>>> Line = new ArrayList<ArrayList<ArrayList<String>>>();
    Line.add(Squared);
    //repeat to make 5 items in list
但接下来是几行:

Before: X
After: 0
除非我的循环中发生意外情况,否则数据没有理由更改回原来的状态。。。我盯着它看了一段时间都没有用。我检查了所有的大小变量,它们看起来都是正确的。当我重新组装数据时,输出文件也正确打印(代码未显示)。我还使用了DB.add(Line)在一个单独的、先前的循环中,以防它弄乱了一些东西,但没有骰子


如果我错过了什么,请告诉我!谢谢我也知道可能有更好的方法来做这件事,但这必须要奏效;它不必特别高效或优雅。

对眼睛更有害的是变量使用大写:“Single”、“Square”、“Line”根据所有Java风格指南都应该是小写的。但这不是你问题的原因

您多次向DB对象添加相同的“行”。您应该为每一行创建一个新的ArrayList(),否则,如果向行列表中添加一个项目,则会为每个索引“i”添加该项目


对于“single”和“squared”同样适用,您将同一个“single”数组列表多次添加到“squared”中,而不是每次添加一个新的数组列表,因此它们也不会有区别。

这不是一个最小的可复制示例。什么是DB?当您第一次使用
j
时,您使用的是
j+1
。但是稍后,当您执行
get
时,只需使用
j
。对于从
0到4的相同循环,您可以使用
j
j+1
,这对我来说没有意义。我想你要么会错过什么,要么会抛出异常。但是没有一些样本数据很难确定。对不起,这让我感到困惑。除了ID列之外,输入数据文件和DB结构是相同的,因此j+1和j之间的切换是将它们对齐。列索引0指向输入文件中的名称,但DB中的实际数据。哦,这很有意义。所以我添加的“Line”的每个实例都与其他实例共享它的所有值,这就是为什么它都被重置了?不,它不共享,它是同一个实例(相同的内存位置)
Before: 0
After: X
Before: X
After: 0