Java 如何创建列表<;T>;具有N-1个相等对象+;一个不同的?
我找到了Java 如何创建列表<;T>;具有N-1个相等对象+;一个不同的?,java,list,java-8,Java,List,Java 8,我找到了Collections.nCopies,但它返回ImmutableList,因此我无法使用add() 最具可读性的方法是什么?将不可变的列表传递给数组列表构造函数: List<YourClass> list = new ArrayList<>(Collections.nCopies (n-1, object1)); list.add(object2); 好吧,看起来不错,但是绕过不可变性是否会节省内存(我想我们基本上会创建两次相同的列表)?@AlexAlex由集
Collections.nCopies
,但它返回ImmutableList
,因此我无法使用add()
最具可读性的方法是什么?将不可变的
列表
传递给数组列表
构造函数:
List<YourClass> list = new ArrayList<>(Collections.nCopies (n-1, object1));
list.add(object2);
好吧,看起来不错,但是绕过不可变性是否会节省内存(我想我们基本上会创建两次相同的列表)?@AlexAlex由
集合返回的原始不可变列表。nCopies
占用O(1)内存,因此无需担心。为了拥有一个可变列表,您无法避免创建一个占用线性空间的列表。第二个变量更可取,因为默认情况下new ArrayList(collection)
创建的数组列表的容量与传入集合的大小完全相同,因此添加另一个元素会导致容量增加操作。因此,在第二种变体中,容量从一开始就是完美的。没有办法让它更快…我所说的可读性是指使用Collections.nCopies
而不是普通的for
循环。我也想提高内存利用率。您是否意识到这是复制n次的List
中的同一个实例?它使用的是List
的一个实现,基本上需要n
和实例来创建一个“假”List
,如果您请求size()
,则返回n
,如果它在正确的范围内,则任何get(index)
都将返回相同的实例。看见
List<YourClass> list = new ArrayList<>(Collections.nCopies (n, object1));
list.set(someIndex, object2);
List<YourClass> list =
IntStream.range(0,n)
.mapToObj(i -> i != specialIndex ? object1 : object2)
.collect(Collectors.toList());