java 高效的hashmap遍歷方法

2021-06-28 11:31:25 字數 1468 閱讀 4087

hashmap的遍歷,key和value通常的方法有兩種,及使用entryset或者keyset遍歷,下面我們來看下例項。

public class testhashmap

for (iteratoriterator = map.keyset().iterator(); iterator.hasnext();)

long time2 = system.currenttimemillis();

long time = time2-time1;

system.out.println(time);

}private static void test2()

for (iterator> iterator = map.entryset().iterator(); iterator.hasnext();)

long time2 = system.currenttimemillis();

long time = time2-time1;

system.out.println(time);

}public static void main(string args)

}hashmap是乙個通過雜湊表實現的儲存,底層是陣列存放的元素,而hashmap的乙個元素就是乙個entry,也就是乙個key-value的鍵值對,所以通過entry的遍歷可以一次獲取到key-value的鍵值對。但是通過keyset遍歷的話,是先set集合裡取出key,然後再通過map.get(key)活得value,通過hashmap原始碼分析得知,get(key)方法是又進行了一次迭代,找到entry,從而獲得到的value,所以效率上用entry遍歷更高。下面來看下map的get原始碼:

public v get(object key)

// doug lea's supplemental secondaryhash function (inlined)

int hash = key.hashcode();

hash ^= (hash >>> 20) ^ (hash >>> 12);

hash ^= (hash >>> 7) ^ (hash >>> 4);

hashmapentry tab = table;

for (hashmapentrye = tab[hash & (tab.length - 1)];

e != null; e = e.next)

}return null;

}通過原始碼分析得知,當通過 key 取出對應 value 時,系統只要先計算出該 key 的 hashcode() 返回值,在根據該 hashcode 返回值找出該 key 在 table 陣列中的索引,取出該索引處的 entry,最後返回該 key 對應的 value 即可,此時如果對應的索引只訪問乙個entry,效率最高,但是如果hash衝突導致,儲存的是乙個entry鏈,就需要遍歷找到需要的entry,這時候效率就要下降了。

但是大家有沒有發現hashmap遍歷是無序的呢,我們會在接下來的文章給大家講解,謝謝。

HashSet和HashMap的使用和遍歷

通過使用迭代器的方式遍歷hashset iterator iterator students.iterator while iterator.hasnext 通過foreach的方式遍歷hashset 這邊我們建立乙個hashmap還是存入前面的三個物件 建立乙個hashmap,通過put方法加入資...

Rust 兩數之和 一遍HashMap

給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。解決方案 判斷target nums i 是否存在map中,之後把nums i 插入map.use std col...

java中hashmap的作用

就是乙個鍵值對應的集合 hashmap a new hashmap a.put name abcdef key是name,value是字串abcdef system.out.println a.get name 根據key取得其值並輸出 list list new arraylist list.ad...