Collections.nCopies() 和 For-loop 初始化的区别

6

我最近发现,在Java中,可以通过调用Collections.nCopies()方法来初始化列表,而不是使用for循环。但这让我想知道,使用这种方法是否比使用for循环有性能优势/劣势,还是只是一种更简单的做法?


你尝试过测试这个吗? - Tonny Madsen
2个回答

10
由于nCopies返回的集合是不可变的,因此此集合中的条目不需要“实体化”。换句话说,只需要一个类型为T的单个对象的空间;其他所有内容都是实现集合接口的内容,假装拥有N个对象的集合,但实际上只有一个对象,它返回N次。
当您创建的集合很大时,这可能会在空间方面带来很大的改进:实际上,集合越大,与使用for循环初始化的真实集合相比,您的节省就越大。

+1 - 值得一提的是,在Java 6和Java 7中,“nCopies”方法确实会表现出这种行为(我已经检查过代码),并且没有理由期望未来版本会改变这种行为。 - Stephen C
因为它返回一个不可变集合,这是否会影响ArrayList的add()方法? - Omar Abdeldayem
@OmarAbdeldayem 是的,你肯定会得到一个 RuntimeException,而且还可能是一个 UnsupportedOperationException - nachokk
@OmarAbdeldayem 这就是问题所在,它返回的是 List<T> 的一个实现,但不是 ArrayList。它是 Collections 的一个内部类,名为 CopiesList演示)。CopiesList 不允许你向其中添加、删除或放置任何对象 - 你会得到一个异常。 - Sergey Kalinichenko
另外,因为只有一个类型为T的对象,更改一个索引处的对象是否会影响整个集合?编辑:我刚试了一下,确实会。谢谢大家的帮助。 - Omar Abdeldayem

0

当您将nCopies()用作List构造函数的参数时,不可变性不是问题:构造函数会创建一个副本,该副本不是不可变的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接