不可欠インタビュー:HashMapのは、データ構造の基礎となりますか?jdk1.8アルゴリズムの最適化、ハッシュ紛争、拡大やその他の問題

インタビューシリーズは、同じようにスプレーしないでくださいしていない参考のために、長い理論、直接答えを検証する必要はありません。

1、HashMapをください基本原則について話しますか?

HashMap<String,String> map = new HashMap<String,String>(); 

map.put(“key”,”value”); 

[<key1,value1>,<key2,value2>,<key3,value3>] 

格納する配列で実装リストの下にある+のHashMap <キー、値>データの形で我々が呼び出したとき、(キー、値)入れて、最初のキーは、ハッシュのハッシュ値(キー)によって取得することができる、配列の長さのハッシュ値競合がない場合はjdk1.8の導入は赤黒後のリストの長さよりも木を、格納された場所のその後競合リスト、アレイに直接バケット次いで、バケットアレイ格納場所を突き止めるためにモジュロ演算、図8は、赤黒木、及び6未満にその後変換バックした後に使用されるであろう。

サプリメントの第1条を次のように2,3ストリップは面接を依頼する、予防罰金です。

2、jdk1.8最適化アルゴリズム、ハッシュアルゴリズムや対処します

ハッシュアルゴリズムのjdk1.8は、ハッシュキー(キー)である場合の前、すなわち文書1にいう、モジュロ演算を用いて、計算され、すなわち、最適化アルゴリズムを、アドレス指定に使用され、最適化されています。(N-1)・ハッシュ「N配列の長さです。」

なぜ使用アルゴリズムは、それに対処するには?最初の「ハッシュ・(N-1)ハッシュモジュロN効果を持つ」効果は同じであるが、性能「&」と動作はハッシュモジュロNに優れています。

3、ハッシュの競合?どのように解決するには?

私たちはときに<キー、値>を入れ、最初に「&」によって操作後に、ハッシュ(キー)でハッシュ値を計算し、そして、計算された保管場所バケットの配列となっているが、この時点で二つの異なるキーがありました例えば、バケットに等しいです:

数组A[0]位置计算出存放<张三,我是张三>数据,而在put<李四,我是李四>数据时,也计算为存放在A[0]位置,一个位置想存放两个数据?这就出现hash冲突了,怎么处理呢?

JDK是这样处理的,它会在这个位置(A[0])挂一个链表,这个链表表里面存放出现冲突的数据,即:让多个<key,value>数据同时放在数组的一个位置里。

get(key)时怎么取呢?当我们调用get(key)定位到数组位置时,如果发现这个位置挂载的是一个链表,那么就遍历链表,从里面找到自己想要的那个<key,value>数据。

格外补充:这个地方,在JDK1.8之后引入了红黑树的概念,首先我们看一下为啥要引入红黑树,如果没有引入红黑树,当数组挂载的链表达到一定长度之后,查询是非常耗时的,性能比较差,时间复杂度为:O(n)「读作:偶en」。

JDK1.8的优化就是,当链表的长度发到了一定长度后(8)会自动转换为红黑树,遍历一棵红黑树查找一个元素的时间复杂度为:O(logn)「读作:偶,老个en」,性能相对链表要高一些。

简单总结一下:

  1. 出现hash冲突的原因?两个不同的key计算出相同的数组存放位置;

  2. 初期是怎么解决的?在出现数组冲突的位置挂一个链表,实现存放多个数据。

  3. JDK1.8的优化?当数组长度达到一定值后自动转换为红黑树,降低时间复杂度。

4、HashMap是如何扩容的?

HashMap底层是一个数组,当数组满了之后,他会自动进行2倍扩容,用于盛放更多的数据。

比如,本来数组默认长度=16,扩容后*2=32。

扩容后还有一步操作:rehash,重新对每个hash值进行寻址,也就是用每个hash值跟新的数组长度 n-1 进行『&』与运算操作。

补充:扩容之后的与运算可能会导致之前的发生hash冲突的元素不再发生冲突。

博客地址:https://www.cnblogs.com/niceyoo

おすすめ

転載: www.cnblogs.com/niceyoo/p/12508024.html