从集合框架概述:
不支持修改操作(例如
add,remove和clear)的集合称为不可修改.不可修改的集合是可修改的.另外保证
Collection对象中没有可见变化的集合称为不可变.不可变的集合是可变的.
我无法理解这种区别.这里不可修改和不可变
的区别是什么?
假设我正在编写一个应该返回Map的方法.例如:
public Map<String, Integer> foo() {
return new HashMap<String, Integer>();
}
Run Code Online (Sandbox Code Playgroud)
在考虑了一段时间之后,我决定在创建Map之后没有理由修改它.因此,我想返回一个ImmutableMap.
public Map<String, Integer> foo() {
return ImmutableMap.of();
}
Run Code Online (Sandbox Code Playgroud)
我应该将返回类型保留为通用Map,还是应该指定我返回一个ImmutableMap?
从一个方面来说,这就是为什么创建接口的原因; 隐藏实现细节.
另一方面,如果我将这样离开,其他开发人员可能会错过这个对象是不可变的这一事实.因此,我不会实现不可变对象的主要目标; 通过最小化可以更改的对象的数量来使代码更清晰.甚至最糟糕的是,过了一段时间,有人可能会尝试更改此对象,这将导致运行时错误(编译器不会对此发出警告).
我想使用Java 9中的新工厂方法创建一个不变的hashMap内联Map.ofEntries(),例如:
Map<Integer, String> map = Map.ofEntries(
Map.entry(1, "One"),
Map.entry(2, "Two"),
Map.entry(3, "Three"));
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我发现我无法以相同的方式创建不可变的hashMap!例如,以下代码将不起作用。
HashMap<Integer, String> map = HashMap.ofEntries( //not work
Map.entry(1, "One"),
Map.entry(2, "Two"),
Map.entry(3, "Three"));
Run Code Online (Sandbox Code Playgroud)
然后,当我想检查工厂方法返回的地图类型时,发现以下注意事项:
调用者不应对返回实例的身份做任何假设。
所以我的问题是,不可变映射的访问时间复杂度是否与o(1)的hashMap相同?如果不是,如何创建不可变且同时访问o(1)的映射?最好可以内联创建。
我有一张这样的地图,其中有数百万个条目:
private final Map<String, SomeItem> tops = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我需要获取值列表,这可以通过调用 java.util.Map values()方法来完成。
每次调用方法时都会Collection创建值values(),还是从性能角度预先计算值?
由于我Map有几百万个元素,我不想每次values()调用时都创建新的列表对象。