【问题标题】:Java: performance and complexity for codeJava:代码的性能和复杂性
【发布时间】:2016-01-11 11:32:23
【问题描述】:

我有如下两段代码:

code 1:

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

code 2:

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

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

【问题讨论】:

  • 不是一个直接的答案:你有没有想过对此进行微基准测试?除此之外(在我看来):代码变体 2 看起来不太好。
  • @Marged 不是直接答案吗?也许你的意思是“问题”?无论如何,这里有什么间接的?
  • 如果使用 Java 7 或更早版本,integerVsLongMap 中是否有非空值的限制?如果不是,(2) 是唯一的正确 方法,因为地图中可能存在空值。正确性应该胜过效率和可读性。如果使用 Java 8,请使用 Map.getOrDefault
  • 我想说我的评论/回答并不是直接完全回答你问题的那种回复。就是这样。

标签: java performance time-complexity space-complexity


【解决方案1】:

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

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

在我看来。

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

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

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

【讨论】:

  • 他不是在谈论性能,而是在谈论空间和时间复杂度(我猜是使用 Big-O 表示法),但是是的,这也(甚至更重要)重要。
【解决方案2】:

空间和时间复杂度总是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多