Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用嵌套列表改进n元素的列表初始化_Java_Performance_Arraylist - Fatal编程技术网

Java 使用嵌套列表改进n元素的列表初始化

Java 使用嵌套列表改进n元素的列表初始化,java,performance,arraylist,Java,Performance,Arraylist,我想在不使用for循环的情况下初始化嵌套列表,根列表即:cakeList将包含另一个列表,例如(100) 我的代码: 1. ArrayList<ArrayList<Integer>> cakeList = new ArrayList<>(); 2. for (int i=0;i<100;i++) cakeList.add(new ArrayList<>()); import java.util.ArrayList; public class

我想在不使用for循环的情况下初始化嵌套列表,根列表即:cakeList将包含另一个列表,例如(100)

我的代码:

1. ArrayList<ArrayList<Integer>> cakeList = new ArrayList<>();
2. for (int i=0;i<100;i++) cakeList.add(new ArrayList<>());
import java.util.ArrayList;
public class Solution {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> cakeList = new ArrayList<>(100);
        cakeList.forEach(e-> new ArrayList<>());
        System.out.println(cakeList.size());
        cakeList.get(0);
    }
}
1。ArrayList cakeList=新的ArrayList();
2.对于(int i=0;i,可以方便地使用和创建预定义数量的对象,因此对于2D列表,如下所示:

列表,但它会创建同一对象的N个副本,这可能会产生副作用,将一个元素中的更改应用于列表中的所有其他“复制”元素

List cakeList=Collections.nCopies(100,new ArrayList());
cakeList.get(0).add(111);//111被添加到cakeList中的“all”条目中

初始化很好,但初始化后,列表都是空的,正如您所期望的那样(请参阅构造函数)

根据本手册的方法部分

由于列表为空,指定位置没有元素。 创建非空ArrayList的唯一方法是使用接受集合的构造函数(请参阅)。 例如:

arraylistnumbers=新的ArrayList(Arrays.asList(1,2,3,4,5));
numbers.get(0);//将返回1
您不希望使用for循环进行初始化的目标是可以理解的,但请参见这一部分,了解两种方法的速度比较

cakeList.forEach(e-> new ArrayList<>());
cakeList.forEach(e->newarraylist());
相当于

Iterator<T> iter = cakeList.iterator();
while (iter.hasNext()) {
  iter.next().add(new ArrayList<Integer>();
}
迭代器iter=cakeList.Iterator(); while(iter.hasNext()){ iter.next().add(新的ArrayList(); }

您将得出的结论是,填充数组没有捷径,它将采用O(n),其中n是数组大小。

使用lamda的第二种方法将提供IndexOutOfBoundsException,因为cakeList最初是空的。尝试第一种方法时您是否面临任何问题?
cakeList.forEach(e->new ArrayList());
此方法“是”会向我抛出异常,因为cakeList为空。@HeribertoHaydar,
cakeList。forEach
不会在
cakeList
为空时抛出
IndexOutOfBoundsException
,只是因为这里没有索引。请澄清您的问题。正如Alex Rudenko所说,没有异常,是否要初始化您的
cakeList
没有使用for循环,例如使用
Stream
?@AlexRudenko我重写了代码..您是对的,异常被抛出是因为列表是空的..否是因为`cakeList.forEach(e->new ArrayList());`this code.:)谢谢,我使用这个:``````创建IntStream.rangeClosed(1,N).forEach(e->cakeList.add(new ArrayList());``@HeribertoHaydar,如果您使用流API,则无需以这种方式使用
forEach
来修改外部对象。创建所需对象的流(此处为空
ArrayList
)并将它们收集到
列表
或更新中显示的其他集合中。谢谢!你说得对..我不担心速度--更重要的是编写一个++可读代码,减少for循环=)。我使用的代码是:`//Create.IntStream.rangeClosed(1,N).forEach(e->cakeList.add(newarraylist())`
cakeList.forEach(e-> new ArrayList<>());
Iterator<T> iter = cakeList.iterator();
while (iter.hasNext()) {
  iter.next().add(new ArrayList<Integer>();
}