【发布时间】:2021-09-08 13:48:47
【问题描述】:
在37:19 of this talk by Stuart Marks on Java Collections 提供的示例的提示下,我想知道从空间效率的角度来看,使对象列表不可变的最佳方法是什么。
在我的示例中,我有一个从数据库中检索的对象列表:
List<MyObject> myObjects = myRepository.getMyObjectsThatFitCriteria();
为了使这个列表不可变,我可以想到三种方法来做到这一点
- 将其包装在
Collections.unModifiableList()中,但这会创建另一个对象,并且底层列表本身仍然可以修改 - 流过
myObjects列表并将其收集到一个不可修改的列表中,但这可能会影响性能,尤其是在列表很大的情况下 - 使用 Java 9 中引入的
List.copyOf()静态工厂方法,但这会创建myObjects列表的另一个副本,从而影响内存和存储。
【问题讨论】:
-
Collections.unmodifiableList 创建了一个无关紧要的轻量级包装器。并且原始 List 不会被存储库修改,因此除非您自己的代码打算修改它,否则它永远不会被修改。 List.copyOf 是一样的。请记住,新 List 不会创建新对象,只会引用相同的元素。
标签: java list collections