Java 使用嵌套列表改进n元素的列表初始化
我想在不使用for循环的情况下初始化嵌套列表,根列表即:cakeList将包含另一个列表,例如(100) 我的代码: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
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>();
}