国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談hashmap為什么查詢時間復雜度為O(1)

淺談hashmap為什么查詢時間復雜度為O(1)

2021-11-01 13:19PolarisHuster Java教程

這篇文章主要介紹了hashmap為什么查詢時間復雜度為O(1),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

hashmap為什么查詢時間復雜度為O(1)

Hashmap是java里面一種類字典式數據結構類,能達到O(1)級別的查詢復雜度,那么到底是什么保證了這一特性呢,這個就要從hashmap的底層存儲結構說起

下來看一張圖:

淺談hashmap為什么查詢時間復雜度為O(1)

上面就是hashmap的底層存儲示意圖,要想查看一個鍵值對應的值,首先根據該鍵值的hash值找到該鍵的hash桶位置,即是tab[2]還是tab[1]等,計算某個鍵對應的哈希桶位置很簡單,就是

int pos = (n - 1) & hash,也就是hash%n,因為位運算效率高所以在hashmap實現時使用的是位運算這種方式,需要注意的是哈希桶的數量必須是2^n,所以hashmap一旦擴容必定是哈希桶數量翻番。

通過上面的描述,我們可以知道,根據鍵值找到哈希桶的位置時間復雜度為O(1),使用的就是數組的高效查詢。但是僅僅有這個是無法滿足整個hashmap查詢時間復雜度為O(1)的。hashmap在處理哈希沖突的方式如上圖所示的拉鏈法,在沖突數據沒有達到8個以前該哈希桶內部存儲使用的是鏈表的方式,當某個哈希桶的數據超過8個的情況下,

有下面兩種處理方式:

1、哈希桶的數量是沒有超過64個,那么此時哈希桶數量double,然后數據遷移

2、哈希桶的數量超過了64個,將該哈希桶內部數據進行紅黑樹化處理

所以我們可以看到如果所有哈希桶內部數據都是鏈表存儲的,那么每個哈希桶的數據量不會超過8個,這樣當定位到某個哈希桶時,在該哈希桶繼續查找也可以在O(1)時間內完成,下面看一種極端情況,所有的數據都在同一個桶里面(這種情況只在所有鍵值hash值相同的情況下,這種情況下查詢的時間復雜度為O(lgn),比如下面給出的一個類,所有我們在設置hashmap的鍵值時需要特別注意),在hashmap的文檔里面有這么一段描述,每個哈希桶中元素數量是成泊松分布的,

?
1
listSize = (exp(-0.5) * pow(0.5, k) / * factorial(k)),

不同數量出現的概率如下:

* 0:    0.60653066
* 1:    0.30326533
* 2:    0.07581633
* 3:    0.01263606
* 4:    0.00157952
* 5:    0.00015795
* 6:    0.00001316
* 7:    0.00000094
* 8:    0.00000006
大于8: <千萬分之1

通過上面的統計來看,hashmap的鍵值正常(不同對象的hash值不同的情況),哈希桶數量超過8個概率低于千萬分之一,所以我們通常認為hashmap的查詢時間復雜度為O(1)

PS:

1、哈希沖突百分百的類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
   測試哈希沖突的類,所有的對象都返回同樣的hash值
  **/
   public static class Student{
       private String name;
       Student(String name){
           this.name = name;
       }
 
       @Override
       public int hashCode(){
           return 1;
       }
 
       @Override
       public boolean equals(Object obj){
           if(this == obj){
               return true;
           }
           if(obj == null){
               return false;
           }
           return this.name.equals(((Student)obj).name);
       }
   }

2、我們在實際使用hashmap時需要確保實現hashcode方法以及equals方法,否則不能作為hashmap的鍵值

3、在設置hashmap的鍵值hashcode方法時盡量保證較好的離散型

4、hashmap的鍵值需保證equals方法返回true時,hashcode必須相同,所以在實際中經常使用的鍵值類string,重寫了equals以及hashcode方法

HashMap時間復雜度問題

HashMap底層采用了hash算法

根據 key 獲得 hashCode 值

HashMap 初始有很多個類似于“桶”的數據結構,比如說預設了 10 個桶,通過 hashCode 經過一定的算法(這個算法必須是快速的)

得到這個 hashCode 應存在哪個桶中,然后內部生成 Map.Entry 對象將 key 和 value 存到桶中去。

所以一般情況下HashMap的插入和查找的時間復雜度都是O(1);

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://jonhuster.blog.csdn.net/article/details/104727895

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品久久精品 | 色婷婷一区二区三区 | 在线播放一区二区三区 | 蜜桃av一区二区三区 | 亚洲视频成人 | jizzz中国| 久久99精品久久久久久久青青日本 | 一级毛片观看 | av手机在线播放 | 亚洲免费观看视频 | 亚洲国产精品一区二区久久 | 久久久免费视频观看 | 欧美视频在线观看 | 91新视频 | 亚洲精品一区二区三区 | 日韩在线免费 | 欧美日韩一区二区在线观看 | 久久精品亚洲精品 | 国产尤物av| 91网站免费| 青娱乐一区 | 日韩视频一区二区三区 | 毛片免费看电影 | 亚洲一卡二卡 | 午夜影院啊啊啊 | 美女天堂 | 极品美女销魂一区二区三区 | 精品成人 | 黄色影院 | 日韩高清一区 | 6080亚洲精品一区二区 | 午夜网| 小泽玛丽娅 | 欧美与黑人午夜性猛交久久久 | 日本三级视频在线观看 | 羞羞视频在线免费观看 | 亚洲精品一区二区 | 亚洲成人激情在线 | 精品久久国产老人久久综合 | 欧美色综合天天久久综合精品 | 成人福利网站 |