相关疑难解决方法(0)

不可变与不可修改的集合

集合框架概述:

不支持修改操作(例如add,removeclear)的集合称为不可修改.不可修改的集合是可修改的.

另外保证Collection对象中没有可见变化的集合称为不可变.不可变的集合是可变的.

我无法理解这种区别.这里不可修改不可变
的区别是什么?

java collections immutability

156
推荐指数
5
解决办法
7万
查看次数

返回ImmutableMap或Map更好吗?

假设我正在编写一个应该返回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 design-patterns immutable-collections

88
推荐指数
7
解决办法
1万
查看次数

如何在Java 11中创建不可变的hashMap?

我想使用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)的映射?最好可以内联创建。

java dictionary hashmap immutability java-9

5
推荐指数
1
解决办法
197
查看次数

java.util.Mapvalues()方法性能

我有一张这样的地图,其中有数百万个条目:

private final Map<String, SomeItem> tops = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

我需要获取值列表,这可以通过调用 java.util.Map values()方法来完成。

每次调用方法时都会Collection创建值values(),还是从性能角度预先计算值?

由于我Map有几百万个元素,我不想每次values()调用时都创建新的列表对象。

java collections performance dictionary hashmap

3
推荐指数
1
解决办法
2268
查看次数