1. 程式人生 > >深入理解java對映map的底層操

深入理解java對映map的底層操

對映:層次結構:

(1)Map (介面)其子介面和其實現類如下

(一)EnumMap(抽象類)  implements  Map

(二)SortedMap(介面)     exntends  Map           TreeMap extends SortedMap  TreeMap加入如和刪除元素是根據key來進行的,其原理和TreeSet完全一樣

(三)HashMap                     implements  Map 

(四)Hashtable                         implements  Map             Properties   extends Hashtable         HashMap和Hashtable的關係就像ArrayList和Vector的關係,Hashtable是古老的類,所以儘量少用,原理和Hashtable差不多,Properties   是對屬性檔案的操作

 EnumMap中的key值和EnumSet的元素的原理非常相似

(一.1)EnumMap的元素加入儲存的機制是:當建立EnumMap物件 EnumMap  em=new EnumMap(Season.class);時  就把Season型別的列舉值賦給EnumMap的鍵(key)屬性private transient K[] keyUniverse了:併為private transient Object[] vals屬性建立空的陣列用來儲存EnumMap中的value;底層程式碼如下:

public EnumMap(Class<K> keyType) {
        this.keyType = keyType;
        keyUniverse = getKeyUniverse(keyType);
        vals = new Object[keyUniverse.length];
    }

put操作的程式碼如下:先進行型別檢查,如果加入的元素型別不是Season或者其父類,則丟擲異常,

所以EnumMap中只可以存放相同列舉型別的物件,否則會丟擲型別轉換異常,然後把key對應的值加入到vals中,同時size加一

  public V put(K key, V value) {
        typeCheck(key);

        int index = key.ordinal();
        Object oldValue = vals[index];
        vals[index] = maskNull(value);
        if (oldValue == null)
            size++;
        return unmaskNull(oldValue);
    }

remove的操作如下:

   public V remove(Object key) {
        if (!isValidKey(key))
            return null;
        int index = ((Enum)key).ordinal();
        Object oldValue = vals[index];
        vals[index] = null;
        if (oldValue != null)
            size--;
        return unmaskNull(oldValue);
    }

(二.1)TreeSet                     implements    SortedSet

(三.1)LinkedHashSet       exntends  HashSet 

HashMap類中加入元素(可以加入不同型別的元素)的機制和HashSet中的相同:是根據其(鍵)key元素的equals(Object o)方法和hashCode()方法來判斷是否能夠加入新的元素,HashMap中的元素是無序的,刪除key值也是要通過equals(Object o)方法和hashCode()方法來判斷是否存在該key,如果存在則刪除,否則刪除不成功,HashMap中判斷兩個value是否相等,只要通過該物件的equals(Object o)進行判斷就可以了.

LinkedHashMap的原理和HashMap的相同,只是LinkedHashMap是有序的,先加入的排在前面,底層通過連結串列來維護這種順序。

由於HashMapLinkedHashMap類加入和刪除元素的機制是根據add(Object obj)加入物件obj的hashCode()的hash值和equals(Object o)進行比較是否可加入新元素或者存在該元素,由於所有的類的hash值都是整數,是可比較的,並且所有類預設的equals(Object o)方法都可以與任何型別的物件進行比較,如果是與不同型別的物件進行比較時,返回的值是false,所以HashMap和LinkedHashMap中可加入不同型別的元素.

相關推薦

深入理解java對映map底層

對映:層次結構: (1)Map (介面)其子介面和其實現類如下 (一)EnumMap(抽象類)  implements  Map (二)SortedMap(介面)     exntends  Map           TreeMap extends SortedMap 

深入理解Java中的底層阻塞原理及實現

更多 安全 posix pla static events time() 方便 原理 談到阻塞,相信大家都不會陌生了。阻塞的應用場景真的多得不要不要的,比如 生產-消費模式,限流統計等等。什麽 ArrayBlockingQueue、 LinkedBlockingQueue、

深入理解java集合的底層操作

集合:層次結構: (1)Collection (介面)其常用子介面 Set    List  Queue  Set 的子介面和其實現類如下 (一)EnumSet (抽象類)  implements  Set    (二)SortedSet(介面)     exntends

深入理解Java集合之Map

Map筆錄    Map 提供了一個更通用的元素儲存方法。 Map 集合類用於儲存元素對(稱作“鍵”和“值”),其中每個鍵對映到一個值。標準的Java類庫中包含了Map的幾種基本實現,包括HashMap、TreeMap、LinkedHashMap、WeakHashMap、Co

深入理解Java虛擬機- 學習筆記 - 虛擬機類加載機制

支持 pub eth 獲取 事件 必須 string 沒有 字節碼 虛擬機把描述類的數據從Class文件加載道內存,並對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。在Java裏,類型的加載、連接和初始化過程都是在程序

JVM運行時數據區--深入理解Java虛擬機 讀後感

出棧 很好 棧幀 最大 出錯 生命周期 所有 img 就會 程序計數器 程序計數器是線程私有的區域,很好理解嘛~,每個線程當然得有個計數器記錄當前執行到那個指令。占用的內存空間小,可以把它看成是當前線程所執行的字節碼的行號指示器。如果線程在執行Java方法

深入理解JAVA集合系列四:ArrayList源碼解讀

結束 了解 數組下標 size new 數組元素 開始 ini rem 在開始本章內容之前,這裏先簡單介紹下List的相關內容。 List的簡單介紹 有序的collection,用戶可以對列表中每個元素的插入位置進行精確的控制。用戶可以根據元素的整數索引(在列表中的位置)訪

深入理解JAVA集合系列三:HashMap的死循環解讀

現在 最新 star and 場景 所有 image cap 時也 由於在公司項目中偶爾會遇到HashMap死循環造成CPU100%,重啟後問題消失,隔一段時間又會反復出現。今天在這裏來仔細剖析下多線程情況下HashMap所帶來的問題: 1、多線程put操作後,get操作導

深入理解JAVA I/O系列三:字符流詳解

buffer 情況 二進制文件 感到 復制代碼 使用範圍 轉換 fileread 方式 字符流為何存在 既然字節流提供了能夠處理任何類型的輸入/輸出操作的功能,那為什麽還要存在字符流呢?容我慢慢道來,字節流不能直接操作Unicode字符,因為一個字符有兩個字節,字節流一次只

重讀《深入理解Java虛擬機》

-xmx 垃圾收集 劃分 tac 棧內存 列表 進行 nbsp 申請 一、Java虛擬機內存區域如何劃分 1、Java虛擬機內存區域的劃分 區域名稱 作用(用途) 類型 特點 虛擬機規定異常情況 其他說明 1 程序計數器 指示當前正在執行的字節碼指

深入理解java關鍵字--static

ack col 之間 jvm -s nbsp 代碼 實例變量 family static 關鍵字是java中經常用到的一個關鍵字,在面試中也會經常遇到的一個問題,下面詳細描述這個關鍵字的相關知識點。

深入理解 Java 虛擬機之學習筆記(1)

over 信息 hotspot 體系 ima 模塊化 介紹 style 創建 本書結構: 從宏觀的角度介紹了整個Java技術體系、Java和JVM的發展歷程、模塊化,以及JDK的編譯 講解了JVM的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產

深入理解java虛擬機7---線程安全 & 鎖優化

err iou nan gpa egg aik risl cpn hang python%E5%AD%A6%E4%B9%A0%20%20%20%20%20%E5%8F%98%E9%87%8F%E7%9A%84%E6%93%8D%E4%BD%9C%20%E4%B8%8E%20

深入理解Java PriorityQueue

() 計算 ren span ring amp exception 刪除 聯系 深入理解Java PriorityQueue PriorityQueue 本文github地址 Java中PriorityQueue通過二叉小頂堆實現,可以用一棵完全二叉樹表示。本文從Queu

深入理解Java虛擬機》筆記04 -- 並發鎖

server som 競爭 包括 系統 cap cnblogs blocks 嘗試 Java虛擬機在操作系統層面會先盡一切可能在虛擬機層面上解決競爭關系,盡可能避免真實的競爭發生。同時,在競爭不激烈的場合,也會試圖消除不必要的競爭。實現這些手段的方法包括:偏向鎖、輕量級鎖、

深入理解Java:類加載機制及反射

指定 請求 image vm虛擬機 常量池 使用 元素 靜態 創建 一、Java類加載機制 1.概述 Class文件由類裝載器裝載後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲知Class的結構信息:如構造函數,屬性和方法等,J

深入理解Java虛擬機:JVM高級屬性與最佳實踐》讀書筆記(更新中)

pen 內存區域 深度 span 進化 ria 最短 描述 core 第一章:走進Java 概述 Java技術體系 Java發展史 Java虛擬機發展史 1996年 JDK1.0,出現Sun Classic VM HotSpot VM, 它是 Sun JDK 和 Open

深入理解JAVA虛擬機之JVM性能篇---基礎知識點

默認 生命周期 ima 線程 images 對象 情況 -- 是否 一、堆與棧   堆和棧是程序運行的關鍵,其間的關系有必要理清楚,兩者如下圖所示:      1. 堆:   所有線程共享,堆中只負責存儲對象信息。   2. 棧:   在Java中每個線程都會有一個相應的線

深入理解JAVA虛擬機之JVM性能篇---垃圾回收

小數據 alt tro 調優 permsize 多次 快速 com src 一、基本垃圾回收算法 1. 按基本回收策略分   1) 引用計數(Reference Counting)     對象增加一個引用,即增加一個計數,刪除一個引用則減少一個計數。垃圾回收時,只用收集計

深入理解Java:註解(Annotation)--註解處理器

fault this urn 復制代碼 lena ide set java lec 深入理解Java:註解(Annotation)--註解處理器   如果沒有用來讀取註解的方法和工作,那麽註解也就不會比註釋更有用處了。使用註解的過程中,很重要的一部分就是創建於