Java:代码的性能和复杂性

Java: performance and complexity for code

我有两段代码如下:

code 1:

Optional.fromNullable(integerVsLongMap.get(id)).or(getDefaultLong());

code 2:

integerVsLongMap.contains(id) ? integerVsLongMap.get(id) : getDefaultLong();

我想知道哪段代码在 space 和时间复杂度以及编码实践方面更有效和更可取,因为我看到的是两者做同样的事情?

就性能和可读性而言,最好的方法是使用

Long v = integerVsLongMap.getOrDefault(id, getDefaultLong())

在我看来。

性能可能不是问题,但两种解决方案都可以改进:

  • 第一个每次创建一个Optional实例
  • 当一个足够时,第二个进行两次地图查找

所有解决方案的时间复杂度是地图查找之一(例如,HashMap 为 O(1),TreeMap 为 O(log(n)))。

Space和时间复杂度总是O(1),不依赖于地图的大小。但是如果你看看真实的 space 和需要的时间

Long v = integerVsLongMap.getOrDefault(id, getDefaultLong())

integerVsLongMap.contains(id) ? integerVsLongMap.get(id) : getDefaultLong();

是最佳解决方案,因为不会创建新对象。

在内部 getOrDefault 与第二个代码完全相同。 这里是 getOrDefault

的代码
public V getOrDefault(Object key, V defaultValue) {
    Node<K,V> e;
    return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
}

创建一个 Optional 需要始终创建一个新对象。

如果您需要在链中使用返回值,最好的解决方案是 Optional