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
。
我有两段代码如下:
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
。