HashMap是無序的

2021-09-11 07:59:35 字數 1592 閱讀 3447

原文:

hashmap是無序的

一、   說明

hashmap是基於雜湊表map的實現。hashmap的設計初衷主要是為了解決鍵值(key-value)對應的關聯的,hashmap的優勢是可以很快的根據鍵(key)找到該鍵對應的值(value),但是我們在使用的過程中需要注意一下,hashmap是一種無序的儲存結構。hashmap的實現是假定元素是放在乙個圓形的環上,每次put進來的元素根據其hashcode計算該元素在圓環上索引,把該元素放到合適的位置。

二、   put和get關鍵方法

public v put(k key, v value) {

if (key == null)

returnputfornullkey(value);

當傳入的key為null時,則直接呼叫putfornullkey方法,在索引為0的位置壓入該value值,這也就是hashmap為什麼支援壓入null值。

int hash = hash(key.hashcode());

int i = indexfor(hash, table.length);

這兩個方法是很牛x的地方,第乙個方法是根據key的hashcode利用hash方法生成乙個hash值,然後通過indexfor函式獲取table的索引值。

是的,沒錯,hashmap就是通過table的結構來儲存資料的。hashmap最牛x的地方是能根據hash值計算出正確的索引,比較深奧。下面是put的整個方法:

public v put(k key, v value) {

if (key == null)

return putfornullkey(value);

int hash = hash(key.hashcode());

int i = indexfor(hash, table.length);

for (entrye = table[i]; e != null; e = e.next) {

object k;

if (e.hash == hash && ((k = e.key) == key ||  key.equals(k))) {

v oldvalue = e.value;

e.value = value;

e.recordaccess(this);

return oldvalue;

modcount++; 

addentry(hash, key, value, i); 

return null; 

實際上,如果插入的資料在hashmap中已經存在,則呼叫put函式的時候會返回oldvalue。當我們在使用get函式的時候,同樣是根據key的hashcode,從table中的對應索引位置提取該值並返回。

到這裡,我們可以看到hashmap是通過key的hashcode來計算索引的,與元素放入的先後順序沒有什麼關係,所以我們在使用hashmap的時候,千萬不要寄希望於hashmap中的資料與我們壓入的資料的先後順序一致。如果要保證壓入的順序一致,可以使用linkedhashmap物件。

三、   hashmap與hashtable的區別

1.  hashmap允許put進來乙個null元素,hashtable則不允許,put進來null值後拋異常

HashMap是無序序列

一 說明 hashmap是基於雜湊表map的實現。hashmap的設計初衷主要是為了解決鍵值 key value 對應的關聯的,hashmap的優勢是可以很快的根據鍵 key 找到該鍵對應的值 value 但是我們在使用的過程中需要注意一下,hashmap是一種無序的儲存結構。hashmap的實現是...

HashMap無序 LinkedHashMap有序

hashmap為什麼無序?hashmap資料結構是table entry entry是乙個鍊錶結構,資料的每個元素是乙個鍊錶。不同key,但具有相同hashcode便會落在table hashcode 的鍊錶上。即,hashmap順序是由key的hash值決定的,而雜湊值是由一定演算法決定的。當使用...

咿呀,字典是無序的

之前專案中有乙個需求是這樣的 足跡列表 分組是日期,要求是分頁展示 因為是分頁展示因此從伺服器返回的原始資料是以單個的商品為單位的,而不是日期為單位,這就需要客戶端自行處理分組了 客戶端的分組處理 網路請求每一頁內的資料處理 拿到資料 goodsmodel 陣列 跟上乙個做判斷,是同一天就歸到同一組...