Java:代码的性能和复杂性

时间:2016-01-11 11:32:23

标签: java performance time-complexity space-complexity

我有两段代码如下:

code 1:

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

code 2:

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

我想知道哪个代码在空间和时间复杂度以及编码实践方面更有效率和更优选,因为我看到的是两者都做同样的事情?

2 个答案:

答案 0 :(得分:6)

在性能和可读性方面,最好的是使用

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

在我看来。

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

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

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

答案 1 :(得分:1)

空间和时间复杂度始终为O(1),而不是取决于地图的大小。但是如果你看一下所需的真实空间和时间

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