Java-100天知識進階-HashMap如何在Java中工作-知識鋪

2021-01-19 知識鋪

知識鋪: 致力於打造輕知識點,持續更新每次的知識點較少,閱讀不累。不佔太多時間,不停地來喚醒你記憶深處的知識點。

一、認識HashMap

Java中的HashMap散列存儲。

1.1 是一種數據結構,它允許我們存儲對象並在我們知道key的情況下在恆定時間O(1)中檢索它。

1.2 在散列中,散列函數用於連接HashMap中的鍵和值。通過調用HashMap的put(key,value)方法存儲對象,並通過調用get(key)方法檢索對象。當我們調用put方法時,調用key對象的hashcode()方法,以便map的hash函數可以找到存儲value對象的位置,這實際上是內部數組的索引,稱為索引表。

1.3 HashMap在內部以Map.Entry對象的形式存儲映射,該對象包含鍵和值對象。如果要檢索對象,請調用get()方法並再次傳遞key對象。這一次,key對象生成相同的hashCode。這裡需要注意的是,如果key是自定義變量,需要實現hashCode 和equalsequals方法。 一般使用的是String作為可以,這是由於String實現了自己的hashCode 和方法,只有這樣保證計算出來的索引最終會在同一個桶位置。

1.4 HashMap的內部數組是固定大小的,並且如果你繼續存儲對象,在某些時候hash函數將為兩個不同的鍵返回相同的索引位置,這在HashMap中稱為碰撞。在這種情況下,在該桶位置處形成鍊表,並且將新Entry存儲為下一節點。

1.5 從此鍊表中檢索對象,我們需要額外檢查以搜索正確的值,這是通過equals()方法完成的。由於每個節點都包含一個Entry,HashMap使用equals()保持比較Entry的key對象和傳遞的key,當它返回true時,Map返回相應的值。

1.6 搜索內聯列表是O(n)操作,因此在最壞的情況下,哈希衝突將映射減少到鍊表。最近在Java 8中通過將鍊表替換為樹以在O(logN)時間內搜索來解決此問題。

二、Hashtable和HashMap之間的區別

2.1 HashMap 特點

HashMap 允許 null作為key , 線程不安全, 查詢key時間複雜度 O(1)

2.2 HashMap 的 put 具體操作

HashMap實現調用hashCode方法在Key對象上,將返回的hashcode應用到自己的散列函數中,找到用於存儲Entry對象的存儲桶位置,檢測hashCode碰撞,然後繼續在該桶的位置維護一個鍊表,將該value對應的Entry對象進行存儲下一個節點上。

2.3 HashMap 的 hashCode碰撞

不同的key進行hashcode計算後,然後進行索引定位的時候,容易發生碰撞。這是由於我們的hashMap中的桶個數是一定的,計算的code值進行長度取模的時候,落到同一個索引桶中。

如圖:get方法如何在Java中的HashMap中工作

a. 先計算出 key 的hashcode對應的索引桶位置

b. 索引桶找到後,在遍歷鍊表,進行key,value比較

2.4 為什麼String,Integer和其他包裝類被認為是好的鍵?

String ,Integer 和其他包裝類是HashMap 鍵的自然候選者,String 也是最常用的鍵,因為String是不可變的和final的,並且會覆蓋equals 和hashcode()方法。其他包裝類也共享類似的屬性。不可變性是必需的,以防止用於計算hashCode()的欄位發生變化,因為如果key對象在插入和檢索期間返回不同的hashCode,則無法從HashMap 獲取對象。 不可變性是最好的。

2.5 可以在HashMap中使用任何自定義對象作為鍵

Java HashMap中使用任何Object 作為鍵,前提是它覆蓋equals和hashCode方法,並且一旦將對象插入Map,其hashCode就不應該變化。

2.6 使用ConcurrentHashMap代替Hashtable

Hashtable 是同步的,但是ConcurrentHashMap 只通過鎖定分級桶來提供更好的並發性。ConcurrentHashMap 肯定是作為Hashtable 引入的 ,可以代替它使用,但Hashtable 提供比ConcurrentHashMap更強的線程安全性。

三、總結HashMap

3.1 HashMap的工作原理是散列,我們有put()和get()方法來存儲和檢索來自HashMap的對象。當我們將key和value傳遞給put()方法存儲在HashMap上時,它使用key對象hashcode()通過對該哈希值來計算索引位置。檢索它時使用key對象equals方法來找出與該key關聯的正確key值對和返回值對象。HashMap在發生衝突時使用鍊表,對象將存儲在鍊表的下一個節點中。 此外,HashMap以Map.Entry對象的形式在鍵列表的每個節點中存儲鍵元組和值元組。

3.2 HashMap的hashcode碰撞,它們將存儲在同一個存儲桶中。

3.3 如何在HashMap中處理null鍵?由於equals()和hashCode()用於存儲和檢索值,因此在null鍵的情況下它是如何工作的?

null鍵是在HashMap中專門處理的,putForNullKey(V值)和getForNullKey()有兩種不同的方法。空鍵始終映射到索引0.為了在兩個最常用的操作(get和put)中執行,這個空key被拆分為單獨的方法,但在其他操作中包含條件。簡而言之,在HashMap中使用null鍵時,不使用equals()和hashcode()方法。

如圖:

3.4 JDK 1.7和JDK 1.8中的HashMap改進

JDK 1.7: 對HashMap和ArrayList進行了一些性能改進,減少內存消耗。當你創建HashMap例如新的HashMap()時,它會自動創建一個默認長度的數組

JDK 1.8:HashMap引入了一種改進的策略來處理碰撞。由於散列函數(例如總是返回相同存儲桶的位置),可以將HashMap轉換為連結列表,即將get()方法轉換為在O(n)而不是O(1)中執行。

相關焦點

  • 學習java需要會哪些知識才能夠去應聘工作?
    >swing的入門實例講解控制項、事件處理和布局介紹彈出框和多個窗口之間的切換第十六天、網絡編程——socket的認識:第十七天、多人聊天系統:2.Java高級階段學習了java的基礎知識後,下面我們就進入java的高級階段
  • 2020年最新Java學習路線圖,剛入門編程行業的小白必備知識清單!
    Java技術可謂博大精深,知識體系非常豐富並且也極其複雜,因此想要學習好java其實並不是一件非常輕鬆的事。當然,剛跨入編程行業的小白也無需擔心,2020年最新路線圖中的知識你學完一半基本就可以找個非常不錯的開發工作了,如果想要高薪,那就默默地全部學完吧!
  • 一個Java高級工程師的進階之路
    一個Java高級工程師的進階之路想必Java新手們都想知道如何成為一個Java高級工程師,小編整理了一下Java高級工程師必須具備的一些專業技能供大家參考,希望可以幫到大家!宏觀方面JAVA要想成為JAVA(高級)工程師肯定要學習JAVA。一般的程式設計師或許只需知道一些JAVA的語法結構就可以應付了。
  • 問號臉為什麼 Java 中1000==1000 為 false而 100==100 為 true
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫為什麼 Java 中「1000==1000」為false,而」100==100「
  • Java基礎知識中的類
    3、引用包中的類時,使用import語句。import語句的基本格式為import包名.類名,其中import為關鍵字,包名和類名之間用圓點(.)隔開。例5:編寫程序測試包,先建立一個Company文件夾,然後建立名為Manager.java的類文件。
  • 為什麼Java中1000==1000為false,而100==100為true?
    如果你運行下面的代碼:Integer a = 1000, b = 1000; System.out.println(a == b);//1Integer c = 100, d = 100; 如果你看去看 Integer.java 類,你會發現有一個內部私有類,IntegerCache.java,它緩存了從 - 128 到 127 之間的所有的整數對象。
  • java如何快速入門?
    java如何快速入門正確掌握Java的基本知識由於Java為開發人員提供了如此多的特性和選項,人們有時會被分散注意力在太短的時間內學習了太多的東西別只是看Java的基礎技能書籍如果你學習Java的唯一目的是通過第二天的考試,那就當我沒說這個話,把所有能學的東西都記下來,這樣你就可以拿到及格分了。然而,如果你真的很認真地學習Java並想在這方面做得更好,那麼最好的方法不是通過閱讀,而是通過實踐獲取知識,然後以代碼的形式執行所學內容。
  • Java程式設計師進階:Java4大核心基礎必備知識點
    本文總結了零基礎學習Java程式語言的幾個基礎知識要點。希望能夠對剛入門的Java新手有幫助。初學者先弄清這些Java的基本概念也是必不可少的,死記硬背肯定是不行的,重在理解,理解它們之間的區別與聯繫,分別有哪些應用。想想這些代碼中用到了哪些知識點,不要一味地照著書本敲代碼,而不去理解。
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    Java在程式語言排行榜中一直牢牢佔據榜首位置,幾乎所有的大中型網際網路的應用系統在伺服器端開發首選都是Java編程,正因如何吸引這不少年輕人投入該行業,Java雖不想其它程式語言那麼複雜,但是知識體系還是很龐大的,因此想要學好並非容易之事,不少想要跨入Java編程行業的同學們通過網絡搜索各式各樣的學習資料
  • Java面試題:如何對HashMap按鍵值排序
    因此,在鍵或值的基礎上排序HashMap是一個很難的面試問題,如果你不知道如何解決的話。下面讓我們看看如何解決這個問題。1. HashMap存儲每對鍵和值作為一個Entry<K,V>對象。我們之所以要使用鍊表來實現這個目的,是因為在鍊表中插入元素比數組列表更快。
  • Java開發必須要知道的知識體系
    在TIOBE程式語言排行榜中,連續奪得第一寶座,而且國內各大知名網際網路公司,後端開發首選語言:非Java莫屬。今天只是梳理下Java知識體系,後續會針對各類目有更詳細的經驗分享。知識體系JDKJava8Lambda 語句方法引用日期/時間處理API等等,不一一列舉,詳細的參考這些文檔URL: http://www.oracle.com/technetwork/cn/java/javase/documentation/index.html說明: Java8增加了很多新的重要特性,
  • 學好java,掌握java編程思想很重要!學習java分三步
    編程思想很重要,不只是要學會,還要應用的好,如何讓那些呆板字符,在我們的指間有靈魂般的跳躍,這個思想很重要。在現如今,java是一門很熱門的程式語言,想學java的人源源不絕,那麼怎麼零基礎學習java呢?又怎麼有著編程思想呢?我來將我導師的答案告訴你們。
  • Java 基礎知識總結(一)之Java 概述
    Platform Enterprise Edition,開發企業環境下的應用程式,主要針對web 程序開發;JAVASE:Java Platform Standard Edition,完成桌面應用程式的開發,是其它兩者的基礎;JAVAME:Java Platform Micro Edition,開發電子消費產品和嵌入式設備,如手機中的程序
  • JAVA中的註解是如何工作的
    在我們的應用程式代碼中的某些地方,我們經常看到過類似@Override 和的注釋 @Deprecated。註解有什麼含義,為什麼引入的註解,它們是如何工作的工作方式,如何編寫自定義注釋,這些就是我們今天要討論的。什麼是註解?用一個詞來解釋註解就是元數據。元數據就是關於數據的數據。因此,註解就是代碼的元數據。
  • Java學習進階-Stream流
    stringStream1.limit(3).forEach(name -> System.out.println(name)); }}public class Test_map { public static void main(String[] args) { Stream<String> stringStream = Stream.of("100
  • 程序基礎:Java基礎知識一
    在上一篇文章中我們一起配置了Java的基本開發環境,今天我們就一起來創建一個小工程,並且老梁也和大家一起來回顧一部分Java的基礎知識,這些基礎知識有很多是通用的,就是這些知識基本上是不會因為程式語言的區別而有太大的變化,算是程序的基礎。
  • Java中 休眠(sleep)
    Hi,大家好久不見,今天我們在這裡給大家介紹一下關於Java的小知識,在Java中 休眠(sleep),至於運用呢就不和大家做介紹了;接下來就給大家詳細介紹一下如何實現。那我們該如何創建使用呢?java中解析字符串為時間
  • Java學習心得--給初學者的一些建議
    作為最熱門的程序開發語言之一,Java在網際網路領域中的地位無需贅言。熱門也帶來了高薪和大量的工作機會,對那些準備通過學習Java來改變自己命運的學子來說,以下好的學習方法和經驗是非常值得借鑑的。在筆者看來,學習一門語言必備的幾個要點在於,看,練,悟。
  • 4.Java基礎知識-HelloWorld
    System.out.println(「HelloWorld」);4.3 案例代碼一public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld");}}運行代碼步驟:在命令行模式中,
  • 阿里螞蟻金服Java程式設計師面試的11個問題,你會幾個呢?
    比如阿里巴巴java面經、小米java面經、網易java面經等,吸引了大多數的程式設計師們的圍觀。比如面向對象基本知識,這幾乎是面試必考的,比如什麼是類,繼承,多態等等。面向對象的特徵:抽象、繼承、封裝、多態常見算法的應用,包括算法基礎和Java編程實現。總結一般是進行分類總結,善於抓重點,以便抓住面試官痛點。