1机错、HashMap為什么不直接使用hashCode()處理后的哈希值直接作為table的下標不傅?
HashMap自己實現(xiàn)了自己的hash()方法瘪松,通過兩次擾動使得它自己的哈希值高低位自行進行異或運算偿曙,降低哈希碰撞概率也使得數(shù)據(jù)分布更平均;
在保證數(shù)組長度為2的冪次方的時候陕凹,使用hash()運算之后的值與運算(&)(數(shù)組長度 - 1)來獲取數(shù)組下標的方式進行存儲悍抑,這樣一來是比取余操作更加有效率,二來也是因為只有當數(shù)組長度為2的冪次方時杜耙,h&(length-1)才等價于h%length搜骡,三來解決了“哈希值與數(shù)組大小范圍不匹配”的問題;
2佑女、為什么數(shù)組長度要保證為2的冪次方呢记靡?
只有當數(shù)組長度為2的冪次方時,h&(length-1)才等價于h%length团驱,即實現(xiàn)了key的定位摸吠,2的冪次方也可以減少沖突次數(shù),提高HashMap的查詢效率店茶;