1 回答
TA贡献1816条经验 获得超6个赞
Groovy 增强了集合方法,这意味着它在标准集合类中添加了方法。
其中一种方法是toSet():
将集合转换为集合。即使集合已经是一个集合,也总是返回一个新的集合。
用法示例:
def result = [1, 2, 2, 2, 3].toSet()
assert result instanceof Set
assert result == [1, 2, 3] as Set
当你写这个:
Set<String> unmodifiableFruits = Collections.unmodifiableCollection(fruits)
它意味着.toSet()调用将Collection返回的 by强制unmodifiableCollection转换为 a Set,隐式复制数据。
当你写这个:
Set<String> unmodifiableFruits = Collections.unmodifiableSet(fruits)
返回的值已经是 a Set,所以toSet()没有被调用,这意味着unmodifiableFruits和fruits共享数据。
这就是为什么您必须在使用时显式复制数据unmodifiableSet,通过添加new HashSet(...).
Collections.unmodifiableCollection()将集合传递给构造函数时是否使用了正确的方法?
绝对不。使用unmodifiableCollection()和分配 aSet,隐式调用toSet哪个复制数据,隐藏了执行副本的事实。
为确保代码可读性,即任何阅读代码的人(包括 3 年后的您)都会理解它的作用,请使用复制构造函数编写代码以显式复制数据。
嗯,当然,除非这是一个代码混淆练习,在这种情况下,这是一个很好的误导性技巧。
添加回答
举报