hashmap的優化點,創建HashMap時,如果已經知道大概要放多少的數據量,可以自己設置好長度,減少擴容,提高速度。代碼比較,存放3個數。不設置初始化大小
private static void test1(){
long l1 = System.nanoTime();
Map<String,String> dataMap = new HashMap<>();
dataMap.put("1", "A");
dataMap.put("2", "B");
dataMap.put("3", "C");
long l2 = System.nanoTime();
System.out.println("花費時間納秒:" (l2-l1));
}
設置初始化大小
private static void test2(){
long l1 = System.nanoTime();
Map<String,String> dataMap = new HashMap<>(8);
dataMap.put("1", "A");
dataMap.put("2", "B");
dataMap.put("3", "C");
long l2 = System.nanoTime();
System.out.println("花費時間納秒:" (l2-l1));
}
查看兩者的時間差,單位是納秒
多次運行結果,發現設置了長度時,花費的時間短了許多,大概是不設置的1/3存放10萬條數據比較二者耗時,大概是不設置長度的時間的一半
那麼有個問題了,如果創建HashMap是,傳了長度參數5?那它的長度就是5麼?,首先看下一下HashMap的構造函數
可以看到有3個構造方法,無參構造函數,我們知道默認的長度是16
/**
* The default initial capacity - MUST be a power of two.
* 默認初始容量-必須是2的幂。
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
隻有一個參數的就是可以自定義初始map的長度,若果我們傳的參數是5,那麼map的長度就是5嗎?
答案是NO,記着看這句話,默認初始容量-必須是2的幂。如果傳的參數是5,hashmap底層會自動幫我們優化成比5大的2的倍數的最小值,也就是2的3次方8。源碼如下
Returns a power of two size for the given target capacity.
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!