list初始化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了list初始化相关的知识,希望对你有一定的参考价值。
参考技术A 1.生成了一个空的 list 容器:2.创建一个带有给定数量的默认元素的列表:
3.生成一个包含给定数量的相同元素的列表:
这里生成了一个具有 50 个 double 型值的列表,并且每一个值都等于 π。注意在圆括号中,不能使用初始化列表 50,3.14159265,这样列表将仅仅包含两个元素。
4.list 容器有一个拷贝构造函数,因此可以生成一个现有 list 容器的副本:
5.可以用另一个序列的开始和结束迭代器所指定的一段元素,来构造 list 容器的初始化列表:
除了 value 中的第一个和最后一个元素,其他元素都被用来生成列表。因为 list 容器的 begin() 和 end() 函数返回的都是双向迭代器,所以不能用它们加减整数。修改双向迭代器的唯一方式是使用自增或自减运算符。当然,在上面的语句中,初始化列表中的迭代器可以代表任意容器的一段元素,而不仅仅只是 list 容器。
可以通过调用 list 容器的成员函数 size() 来获取它的元素个数。也可以使用它的 resize() 函数来改变元素个数。如果 resize() 的参数小于当前元素个数,会从尾部开始删除多余的元素。如果参数比当前元素个数大,会使用所保存元素类型的默认构造函数来添加元素。
List<List<Integer>> ArrayList 初始化不适用于新运算符 Java
【中文标题】List<List<Integer>> ArrayList 初始化不适用于新运算符 Java【英文标题】:List<List<Integer>> ArrayList initialization does not work with new operator Java 【发布时间】:2016-11-22 21:22:29 【问题描述】:我已经在这个问题上苦苦挣扎了两天。这个问题来自我正在做的一些问题。基本上,当我使用
List<List<Integer>> temp = new ArrayList<>(result);
要创建结果的新 ArrayList 副本,当我尝试在高级 for 循环中更改 temp 时,结果将发生变化。例如,
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
List<List<Integer>> temp = new ArrayList<>(result);
int j = 0;
for (List<Integer> list: temp)
list.add(x[j]);
j ++;
我对循环内的结果没有做任何事情,但结果以 [[1]] 结尾,与 temp 相同。
为什么会这样?非常感谢。
更新:感谢大家回答我的问题。我知道浅拷贝是原因。但是,我仍然遇到类似的问题。当我尝试在以下代码中更改温度时,结果会更新:
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
List<List<Integer>> temp = new ArrayList<>();
for (List<Integer> list: result)
list.add(10000);
temp.add(new ArrayList(list));
我不知道为什么结果是 [[10000]] 以及温度。像 temp.add(new ArrayList(list)) 这样的 add 方法有什么问题吗?
【问题讨论】:
还有,[j]前面的x是做什么用的?new ArrayList<>(result)
只复制result
的浅表副本,即它复制“外部”列表,但不复制其元素。
【参考方案1】:
这并不奇怪,因为您只有一个列表可以迭代。如果您添加第二个列表,您将看到第二个数字。
int[] x = new int[]1,2,3,4,5;
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList());
result.add(new ArrayList());
List<List<Integer>> temp = new ArrayList<>(result);
for (Integer xx: x)
result.add(new ArrayList(xx));
System.out.println(result.toString());
如果您尝试此代码,它将显示您:
[[1],[2]]
【讨论】:
【参考方案2】:temp = new ArrayList<>(result)
只对result
进行浅拷贝,即它复制“外部”列表,而不是其元素。
temp.get(0) == result.get(0)
- 我不是指equals
- 它们是完全相同的实例。
因此,您添加到 temp.get(0)
的任何内容也会出现在 result.get(0)
中。
【讨论】:
您好,先生,如果您有时间,请您再看看我新的类似问题吗?我在帖子末尾更新了问题。【参考方案3】:这是因为List<List<Integer>> temp = new ArrayList<>(result);
语句只复制***列表。它将是包含对原始 result
中原始项目(也称为子列表)的引用的新列表。
您可以使用深层副本解决此问题:
List<List<Integer>> temp = new ArrayList<>(); // empty list
for (List<Integer> sublist : result)
temp.add(new ArrayList<Integer>(result)); // copying a sublist and adding that
【讨论】:
您好,先生,如果您有时间,请您再看看我新的类似问题吗?我在帖子末尾更新了问题。以上是关于list初始化的主要内容,如果未能解决你的问题,请参考以下文章