1. 程式人生 > >【JDK1.8】JDK1.8集合原始碼閱讀——TreeMap(一)

【JDK1.8】JDK1.8集合原始碼閱讀——TreeMap(一)

一、前言

在前面兩篇隨筆中,我們提到過,當HashMap的桶過大的時候,會自動將連結串列轉化成紅黑樹結構,當時一筆帶過,因為我們將留在本章中,針對TreeMap進行詳細的瞭解。

二、TreeMap的繼承關係

下面先讓我們來看一下TreeMap的繼承關係,對它有一個大致的瞭解:

TreeMap的繼承關係

可以看到,除了在之前HashMap裡常見的繼承類和介面以外,TreeMap實現了NavigableMap介面,而NavigableMap繼承自SortedMap,由名字可以看出,只是一個用來實現排序的介面。而這也是為什麼TreeMap能夠實現排序的原因。由於篇幅關係,將TreeMap的原始碼解析分為三部分,本章將對介面NavigableMap以及SortedMap進行解析。

三、SortedMap介面原始碼解析

3.1 SortedMap介面

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public interface SortedMap<K,V> extends Map<K,V> { //返回用於對鍵的進行排序的比較器,如果此對映使用其鍵的自然排序,則為null Comparator<? super K> comparator();
//返回從fromKey(包括)到toKey(不包括)之間的map SortedMap<K,V> subMap(K fromKey, K toKey); //返回小於toKey的map SortedMap<K,V> headMap(K toKey); //返回大於或等於fromKey的map SortedMap<K,V> tailMap(K fromKey); //返回map中第一個(最低)鍵 K firstKey(); //返回map中最後一個(最高)鍵 K lastKey(); Set<K> keySet();
Collection<V> values(); Set<Map.Entry<K, V>> entrySet(); }

SortedMap的介面比較簡單,沒有很特別的地方,唯一比較特別的就是返回Comparator這個介面,可以設想實現排序功能的祕密或許就藏在此處。下面讓我們來看一下Comparator和Comparable介面,兩者之間有點關聯,可以理解為Comparable自帶了比較功能,而Comparator是賦予沒有比較能力的物件一種比較能力。舉個簡單例子:面對一道計算題,小明天生口算能力很強,看一眼就能算出來答案。而小李沒有這種能力,需要藉助計算器才能得出答案。

3.2 Comparable介面

先讓我們看下它的程式碼:

1 2 3 4 public interface Comparable<T> { //如果小於o,返回負數;等於o,返回0;大於o返回正數。 public int compareTo(T o); }

對,就是這麼簡單,裡面傳入一個泛型T的物件o,對o進行比較。如果小於o,返回負數;等於o,返回0;大於o返回正數。

我們熟悉的很多物件如StringIntegerDouble等都實現了這個介面。可以來看一下簡單的例子:

1 2 3 4

相關推薦

JDK1.8JDK1.8集合原始碼閱讀——TreeMap

一、前言 在前面兩篇隨筆中,我們提到過,當HashMap的桶過大的時候,會自動將連結串列轉化成紅黑樹結構,當時一筆帶過,因為我們將留在本章中,針對TreeMap進行詳細的瞭解。 二、TreeMap的繼承關係 下面先讓我們來看一下Tre

MySQL資料庫效能優化之索引及優化

一、Mysql效能優化之影響效能的因素 1.商業需求的影響 不合理的需求造成的資源投入產出,這裡就用一個看上去很簡單的功能分析。需求:一個論壇帖子的總量統計,附加要求:實時更新。從功能上看來是非常容易實現的,執行一條select count(*)from表名就可以得到結果,但是如果我們採

Flutter教程從零構建電商應用

在這個系列中,我們將學習如何使用google的移動開發框架flutter建立一個電商應用。本文是flutter框架系列教程的第一部分,將學習如何安裝Flutter開發環境並建立第一個Flutter應用,並學習Flutter應用開發中的核心概念,例如widget、狀態等。 本系列教程包含如下四個部分,敬請期待:

機器學習資料探勘演算法——關聯規則,相關概念,評價指標

綜述:        資料探勘是指以某種方式分析資料來源,從中發現一些潛在的有用的資訊,所以資料探勘又稱作知識發現,而關聯規則挖掘則是資料探勘中的一個很重要的課題,顧名思義,它是從資料背後發現事物之間可能存在的關聯或者聯絡。 關聯規則的目的在於在一個數據集中找出項之間的關

webpack系列從零搭建 webpack4+react 腳手架

搭建一個React工程的方式有很多,官方也有自己的腳手架,如果你和我一樣,喜歡刨根究底,從零開始自己一行一行程式碼建立一個React腳手架專案,那你就來對地方了。本教程是針對React新手,以及對webpack還不熟悉的使用者,或者是想了解當前前端工程化方案的使用者。我會在整個系列通過webpack4的

編譯原理語法制導翻譯之屬性文法

最近對程式語言如何從 原始碼->位元組碼(or 機器碼)->執行 產生了興趣,為此從今天開始,給自己制定了一個學習計劃, 目的是能夠對Java原始碼如何到class檔案位元組碼,再如何在JVM上執行有比較深入的理解。 學習的第一步,就從難啃的編譯原理開始。 之前

影象處理使用OpenCV進行影象處理教程

       OpenCV是進行影象處理的工具,也是計算機視覺領域近十幾年不斷髮展和完善的產物。面對這個已基本成熟的開源庫知識體系,我們新生代有必要不斷地總結、回顧,以新的視角快速融入計算機視覺的奧祕世界。        從這篇隨

Hadoop Yarn原始碼閱讀系列Yarn架構

Yarn的基本思想是將JobTracker的兩大主要職能:資源管理、作業排程/監控拆分為兩個獨立的程序:一個全域性的ResourceManager和與每個應用對應的ApplicationMaster(AM)。ResourceManager和每個節點的NodeManager(NM)組成了全新的通用作業

Spark 原始碼閱讀學習

寫本文的目標就是立下 flag :好好研讀 Spark 原始碼,從 branch-0.7 這個分支開始。 如何通過閱讀原始碼提高自己 大家都說要多讀優秀開源框架的原始碼,那麼怎麼讀呢?像 Apache Spark 在 GitHub 上有兩萬多個 commit

JDK1.8原始碼解析-HashMap

JDK1.8原始碼解析-HashMap I 本文主要介紹了JDK1.8中HashMap的實現原理,對部分常用的API進行原始碼解讀,網上該主題的資源非常多,作者參考了很多相關文章不在文中一一列舉了,在此基礎上加入了自己對部分原始碼的理解。 1. Ha

安卓本卓Android系統原始碼篇之原始碼獲取、原始碼目錄結構及原始碼閱讀工具簡介

前言 古人常說,“熟讀唐詩三百首,不會作詩也會吟”,說明了大量閱讀詩歌名篇對學習作詩有非常大的幫助。做開發也一樣,Android原始碼是全世界最優秀的Android工程師編寫的程式碼,也是Android開發中絕對的權威所在。Android系統開源,且佔據了當今手機系統世界的絕大部分江山,各大手機廠商要做手機系

Qt通過QtCreator原始碼學習Qt:pro檔案

1、學習目的 學習pro檔案的語法規則,這在跨平臺專案中會經常用到。和條件編譯相似,在pro中可以根據平臺選擇不同的編譯模組、檔案,還可以向原始碼中傳遞變數等。 2、學習方法 通過學習QtCreator原始碼中的pro檔案,來掌握pro檔案語法規則,下面以qtcreator.

3月6日原始碼閱讀日記1:HashMap

前言 首先,致敬下幾位authors @author Doug Lea @author Josh Bloch @author Arthur van Hoff @author Neal Gafter HashMap是Java程式設計師使用頻率最高

TomcatTomcat原始碼解讀系列——server.xml檔案的配置

Tomcat是JEE開發人員最常用到的開發工具,在Java Web應用的除錯開發和實際部署中,我們都可以看到Tomcat的影子。大多數時候,我們可以將Tomcat當做一個黑盒來看待,只需要將編寫的Java Web工程進行部署即可,但是,在遇到一些比較複雜難解決的問題時

SSH進階之路Struts + Spring + Hibernate 進階開端

height 一段 ioc 效率 陽光大道 面向對象的思想 text ase 們的 Long Long ago。就聽說過SSH。起初還以為是一個東東,詳細內容更是不詳,總認為高端大氣上檔次,經過學習之後才發現,不不過高大上,更是低調奢華有內涵,經過一段時間的

MM配置SAP MM模塊配置目錄

作者 倉儲 5.1 價格 中心 部分 輸出 會計 soft 目錄1 配置總體框架11.1 系統環境11.2 機構設置11.3 工廠結構概圖:11.4 產品組成結構圖31.5 BOM簡要清單41.6 主要業務藍圖42 一般設置部分(全局)52.1 定義國家SPRO (後補)5

轉載項目管理和構建——Maven下載、安裝和配置

文檔 port 目標 軟件項目管理 strong mar temp mave work 原文鏈接: http://blog.csdn.net/jiuqiyuliang/article/details/41076215 在現實

設計模式module模式&&Revealing module 揭示模式

但是 出版 參數傳遞 9.png 自然 指向 們的 private 初級 寫在前面 《head first設計模式》裏有一篇文章,是說使用模式的心智,   1、初學者"心智" :"我要為HELLO WORLD找個模式"   2、中級人員模式: "或許這裏我需要一個單件

洛谷P2983 [USACO10FEB]購買巧克力Chocolate Buying貪心

輸出格式 準備 anti radius rod money pri price -s 題目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Choco

gulp前端自動化工具---gulp的使用------凡塵

app 一起 dex 前端自動化 指定 sass css 文件的 等待 什麽是gulp? 基於node的自動化構建工具 擴展:開發的時候分為2個節點一個是開發階段 另一個是部署階段 開發階段:源文件不會被壓縮