首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除一个变量(数组列表),而不是无意中清除另一个变量?

如何清除一个变量(数组列表),而不是无意中清除另一个变量?
EN

Stack Overflow用户
提问于 2015-05-28 01:56:28
回答 2查看 245关注 0票数 4

为了明确起见,我有one 3D ArrayList,我打算使用它:来容纳几个2D ArrayLists.

3D ArrayList (当我说3D ArrayList时,这就是我所指的):

代码语言:javascript
复制
ArrayList<ArrayList<ArrayList<String>>> main_Functions = new ArrayList<>();

2D ArrayList (当我说2D ArrayList时,这就是我指的):

代码语言:javascript
复制
ArrayList<ArrayList<String>> localValues = new ArrayList<>();

但是在添加每个2D ArrayList之后,我打算清除保存原始2D ArrayList的变量。所以旧的信息不会干扰新添加的信息等等。但是当我清除保存原始2D ArrayList (添加到3D ArrayList中的内容)的变量之后,添加到3D ArrayList中的数据就会被删除。

我的代码如下:

代码语言:javascript
复制
ArrayList<ArrayList<String>> localValues = new ArrayList<>();
ArrayList<ArrayList<ArrayList<String>>> main_Functions = new ArrayList<>();

           if (arrayListNotEmpty(localValues)) {
                main_Functions.add(localValues);
                localValues.clear();
          }

如何解决这个问题?,以便将信息添加到3D ArrayList中,保留在2D ArrayList的清除中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-28 02:14:04

您的情况基本上是这样的:(我删除了一个级别的ArrayList,以使其更清晰)

代码语言:javascript
复制
ArrayList<String> inner = new ArrayList<>();
ArrayList<ArrayList<String>> outer = new ArrayList<>();

inner.add("Hello World!");
outer.add(inner);
System.out.println(outer.get(0)); // prints [Hello World!]
inner.clear();
System.out.println(outer.get(0)); // prints [] i.e. an empty list

或者,甚至更简单:

代码语言:javascript
复制
ArrayList<String> a = new ArrayList<>();
a.add("Hello World!");

ArrayList<String> b = a;

System.out.println(b); // prints [Hello World!]
a.clear();
System.out.println(b); // prints []

这是因为ab不包含ArrayLists,在Java中,如果我们说变量包含ArrayList,我们实际上的意思是它保存了对ArrayList的引用。

换句话说,a实际上包含的是"ArrayList #1234“或类似的内容。b还包含"ArrayList #1234“。行a.clear()清除ArrayList #1234,行System.out.println(b);打印ArrayList #1234的内容(我们刚刚清除了该内容)。

相反,您可以在想要复制新ArrayList时创建它。

例如,而不是

代码语言:javascript
复制
main_Functions.add(localValues);

你可以做这样的事

代码语言:javascript
复制
ArrayList<ArrayList<String>> localValues_copy = new ArrayList<>(localValues);
main_Functions.add(localValues_copy);

或缩短:

代码语言:javascript
复制
main_Functions.add(new ArrayList<>(localValues));

这将在"3D ArrayList“中添加对全新ArrayList的引用,而不是添加对localValues引用的引用。

票数 4
EN

Stack Overflow用户

发布于 2015-05-28 02:01:54

代码语言:javascript
复制
List<List<String>> localValues = new ArrayList<>();
List<List<String>> localValuesCopy = new ArrayList<>(localValues);

localValues.clear();// won't affect main_Functions

List<List<List<String>>> main_Functions = new ArrayList<>();
main_Functions.add(localValuesCopy);

通过为您的列表创建一个localValues副本,数据将被复制,并且清除它不会影响这些新数据。

虽然我不明白为什么要清除localValues列表,但是清除localValues不会更改main_Functions列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30495961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档