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());