在類初始化期間計算不可變資料結果,並將結果儲存在static final欄位中是一種非常常見的做法。實際上,這正是靜態初始化器的設計目標。
以下是在初始化時構建一些靜態表的典型示例:
public class staticexample
}private static long nextvalue(long seed)
...}
在我的jdk 11.0.1膝上型電腦上,靜態初始化程式在大約540毫秒內填充100m元素的陣列。
現在讓我們簡單地刪除static並填充建構函式中的陣列。
public class nonstaticexample
}private static long nextvalue(long seed)
public static void main(string args)
}
建構函式在138毫秒內填充類似的陣列。幾乎快4倍!
為什麼靜態初始化器會變慢?這必須與jit編譯有關。
解決方法非常簡單:
只是不要直接在未初始化的類中進行繁重的計算。如果將計算邏輯放在沒有靜態初始化程式的輔助類中,它將不會受到效能損失的影響。
public class staticexample
return table;
}static long nextvalue(long seed) }}
靜態初始化中不能放入繁重計算,否則會變慢
在類初始化期間計算不可變資料結果,並將結果儲存在static final欄位中是一種非常常見的做法。實際上,這正是靜態初始化器的設計目標。以下是在初始化時構建一些靜態表的典型示例 public class staticexample private static long nextvalue lon...
java中靜態初始化問題
class bowl public void f1 int maker class table public void f2 int maker static bowl bowl2 new bowl 2 class cupboard public void f3 int maker static b...
java中靜態初始化塊,例項初始化塊,建構函式區別
public class people public people string name param args public static void main string args 執行效果 new兩個例項,從執行結果可以看出,靜態變數和靜態初始化塊都是在類載入到系統時,載入到系統中,靜態初始化...