詳解HashMap數據結構實現

来源:http://www.cnblogs.com/beforedawn/archive/2017/05/13/6850038.html
-Advertisement-
Play Games

HashMap的設計是由數組加鏈表的符合數據結構,在這裡用自己的語言以及結合源碼去總結一下,如果有不對的地方希望評論指正,先拱手謝謝。 HashMap是日常中非常常用的一種數據結構,我們要想深入瞭解學習任何一門技術,都是要先應用,再深入。深入就要瞭解實現的原理,在java語言中,最基本的結構是數組以 ...


  HashMap的設計是由數組加鏈表的符合數據結構,在這裡用自己的語言以及結合源碼去總結一下,如果有不對的地方希望評論指正,先拱手謝謝。

  HashMap是日常中非常常用的一種數據結構,我們要想深入瞭解學習任何一門技術,都是要先應用,再深入。深入就要瞭解實現的原理,在java語言中,最基本的結構是數組以及類變數(引用),HashMap是兩者的結合,更明確的說,HashMap是數組以及鏈表的結合。

public class HashMap<K, V>
  extends AbstractMap<K, V>
  implements Map<K, V>, Cloneable, Serializable
{
  private static final long serialVersionUID = 362498820763181265L;
  static final int DEFAULT_INITIAL_CAPACITY = 16;
  static final int MAXIMUM_CAPACITY = 1073741824;
  static final float DEFAULT_LOAD_FACTOR = 0.75F;
  static final int TREEIFY_THRESHOLD = 8;
  static final int UNTREEIFY_THRESHOLD = 6;
  static final int MIN_TREEIFY_CAPACITY = 64;
  transient Node<K, V>[] table;
  transient Set<Map.Entry<K, V>> entrySet;
  transient int size;
  transient int modCount;
  int threshold;
  final float loadFactor;
...
}

  我們可以看到HashMap維護了一個Node<K,V>數組,在這裡我們再看Node的實現

 static class Node<K, V>
    implements Map.Entry<K, V>
  {
    final int hash;
    final K key;
    V value;
    Node<K, V> next;
.....
}

Node維護了四個屬性,Key,Value,Hash碼,以及關鍵的:Node<K,V> next,每一個Node持有下一個Node,形成了鏈表。

  在這裡奉上一張HashMap的導圖,當我們插入一個值時,即插入了一個Node,通過Node的key的hashcode與Node<K,V> table 數組的長度來計算出這個Node在數組中的位置,也就是下標。計算的方法就是hash演算法,當我們插入一個Node的時候,Key是唯一的,但是不同的key求出的hashcode


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面一篇文章講瞭如何快速搭建一個ActiveMQ的示常式序,ActiveMQ是JMS的實現,那這篇文章就再看下另外一種消息隊列AMQP的代表實現RabbitMQ的簡單示例吧。在具體講解之前,先通過一個圖來概覽下: 1.添加Maven依賴 2.Spring配置文件中添加rabbitmq相關配置 1)消 ...
  • java產生隨機數的幾種方式 一.在j2se里我們可以使用Math.random()方法來產生一個隨機數,這個產生的隨機數是0-1之間的一個double,用時需要int強制轉換,我們可以把他乘以一定的數,比如說乘以100,他就是個100以內的隨機,這個在j2me中沒有。 java.util.Rand ...
  • title: Servlet之JSP tags: [] notebook: javaWEB JSP是什麼 ? JSP就是Servlet,全名是"JavaServer Pages" 。因為Servlet不適合設置html響應體,需要大量的 ,而和html是靜態頁面,不能包含動態信息。JSP完美的解決了 ...
  • java中常用的包、類、以及包中常用的類、方法、屬性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*; 包名 介面 類 方法 屬性 ja ...
  • 題目描述 對於給定的一個長度為N的正整數數列A[i],現要將其分成連續的若幹段,並且每段和不超過M(可以等於M),問最少能將其分成多少段使得滿足要求。 輸入輸出格式 輸入格式: 輸入文件divide_a.in的第1行包含兩個正整數N,M,表示了數列A[i]的長度與每段和的最大值,第2行包含N個空格隔 ...
  • JavaMail,提供給開發者處理電子郵件相關的編程介面。它是Sun發佈的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。但它並沒有包含在JDK中,要使用JavaMail首先要下載javax.mail.jar下載地址:https://javaee.github.io/javamail ...
  • The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an integer n, return al... ...
  • 題目描述 如題,給出一個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,表示該圖共有N個結點和M條無向邊。(N<=5000,M<=200000) 接下來M行每行包含三個整數Xi、Yi、Zi,表示有一條長度為Zi的無向邊連接結點Xi、Yi 輸出 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...