[英]Does the JVM JIT optimises the creation of new objects that are almost equal?
我正在閱讀Functional Java庫的源代碼,並注意到了這一點:
public static <T> Option<T> none() {
return new None<T>();
}
我想知道為什么它們不總是返回單例參數,特別是由於None的相等實現:
private static final class None<A> extends Option<A> {
...
@Override
public int hashCode() {
return 31;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
return true;
}
}
因此,我在Functional Java的論壇上進行了搜索,發現了以下問題和答案:
是否可以進行設置,使其不會為每次對none的調用都創建一個新的None,我們可以在所有情況下使用單個對象表示None嗎?
不,但是,誰在乎呢? 現在,JIT優化器可以很好地處理這些事情。
我的問題是,JIT優化器如何以不必返回單例的方式處理此問題。 我知道對象創建很便宜,但是我認為單例會更便宜,在這種情況下,它不會增加任何復雜性。
不,我知道Java VM不執行這種優化。 使用現代JVM,創建新對象而不是尋找一些現有對象實際上更便宜。 它們在此FAQ中的含義還在於,壽命短,被丟棄的對象並不會真正影響垃圾收集時間(但可能會增加GC頻率)。 我還可以想象JVM執行轉義分析並在堆棧上而不是堆上分配此類對象。
但是我確實認為這很浪費。 查看Guava中的java.lang.Integer
(和所有其他原始包裝器)緩存或Optional.absent()
:
public static <T> Optional<T> absent() {
return (Optional<T>) Absent.INSTANCE;
}
在JDK中還有很多其他優化: enum
是單例, Collections.emptyList()
總是返回相同的實例,依此類推。
它更安全,否則我們需要依靠擦除。
創建對象可能比查找緩存的對象還要昂貴。 參見java8的Optional:
43 private final static Optional<?> EMPTY = new Optional<>();
63 * There is no guarantee that it is a singleton.
69 @SuppressWarnings("unchecked")
70 public static<T> Optional<T> empty() {
71 return (Optional<T>) EMPTY;
72 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.