最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?LinkedHashMap與TreeMap示例詳解

 更新時(shí)間:2026年05月29日 09:41:18   作者:一條泥憨魚  
本文對比分析了Java中LinkedHashMap和TreeMap兩種Map實(shí)現(xiàn)類的特性與使用場景,本文結(jié)合實(shí)例代碼給大家介紹給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

前言:

在學(xué)習(xí) Java 集合框架時(shí),很多同學(xué)已經(jīng)接觸過 HashMap。
但在實(shí)際開發(fā)中,我們還會經(jīng)常遇到另外兩種 Map:

  • LinkedHashMap
  • TreeMap

它們都屬于 Map 接口的實(shí)現(xiàn)類,但各自有不同的特點(diǎn)和使用場景。

這篇文章會從:

  • 基本概念
  • 底層原理
  • 特點(diǎn)區(qū)別
  • 使用場景
  • 代碼實(shí)例

幾個(gè)方面,幫你徹底理解它們。

一、Map 集合基礎(chǔ)回顧

Map 是“鍵值對(key-value)”結(jié)構(gòu)的數(shù)據(jù)集合。

格式:

key -> value

例如:

"張三" -> 18
"李四" -> 20

Java 中常見的 Map:

類型特點(diǎn)
HashMap無序
LinkedHashMap有序
TreeMap自動排序

二、LinkedHashMap

1. 什么是 LinkedHashMap

LinkedHashMapHashMap 的子類。

它最大的特點(diǎn):

能夠保持元素的插入順序。

例如:

1 -> A
3 -> C
2 -> B

遍歷時(shí)仍然是:

1
3
2

不會像 HashMap 一樣順序混亂。

2. LinkedHashMap 底層原理

LinkedHashMap = HashMap + 雙向鏈表

它內(nèi)部:

  • 使用 HashMap 進(jìn)行存儲
  • 使用雙向鏈表維護(hù)順序

結(jié)構(gòu)示意:

數(shù)組 + 鏈表 + 紅黑樹 + 雙向鏈表

其中:

  • HashMap 保證查詢效率
  • 雙向鏈表保證順序

3. LinkedHashMap 的特點(diǎn)

特點(diǎn)說明
有序按插入順序排列
查詢快基于 HashMap
允許 nullkey 和 value 都允許
非線程安全多線程需額外處理

4. LinkedHashMap 基本使用

示例:保持插入順序

import java.util.LinkedHashMap;
public class Demo {
    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(3, "Java");
        map.put(1, "Python");
        map.put(2, "C++");
        System.out.println(map);
    }
}

輸出:

{3=Java, 1=Python, 2=C++}

可以發(fā)現(xiàn):

順序與插入順序一致。

5. 遍歷 LinkedHashMap

import java.util.LinkedHashMap;
import java.util.Map;
public class Demo {
    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(1, "張三");
        map.put(2, "李四");
        map.put(3, "王五");
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            System.out.println(
                    entry.getKey() + " : " + entry.getValue()
            );
        }
    }
}

輸出:

1 : 張三
2 : 李四
3 : 王五

6. LinkedHashMap 的訪問順序

LinkedHashMap 有兩種順序:

順序說明
插入順序默認(rèn)
訪問順序最近訪問的排后面

開啟方式:

new LinkedHashMap<>(16,0.75f,true)

第三個(gè)參數(shù)“true”表示開啟訪問順序。

示例:LRU緩存思想

import java.util.LinkedHashMap;
import java.util.Map;
public class Demo {
    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map =
                new LinkedHashMap<>(16, 0.75f, true);
        map.put(1, "A");
        map.put(2, "B");
        map.put(3, "C");
        //訪問元素
        map.get(1);
        System.out.println(map);
    }
}

輸出:

{2=B, 3=C, 1=A}

因?yàn)椋?/p>

1

被訪問后移動到了最后,這就是很多緩存系統(tǒng)的核心思想。

三、TreeMap

1. 什么是 TreeMap

TreeMap 的最大特點(diǎn):

自動排序。

無論你插入順序如何,它都會自動按照 key 排序。

2. TreeMap 底層原理

TreeMap 底層采用:

紅黑樹(Red-Black Tree)

紅黑樹本質(zhì):

自平衡二叉搜索樹。

特點(diǎn):

  • 查詢效率高
  • 自動排序
  • 增刪改效率穩(wěn)定

時(shí)間復(fù)雜度:

操作時(shí)間復(fù)雜度
putO(log n)
getO(log n)
removeO(log n)

3. TreeMap 的特點(diǎn)

特點(diǎn)說明
自動排序按 key 排序
不允許 key 為 null會報(bào)空指針異常
查詢效率穩(wěn)定紅黑樹實(shí)現(xiàn)
非線程安全多線程需同步

四、TreeMap 默認(rèn)排序

默認(rèn)按照 key 的自然順序排序。

示例:數(shù)字排序

import java.util.TreeMap;
public class Demo {
    public static void main(String[] args) {
        TreeMap<Integer, String> map = new TreeMap<>();
        map.put(3, "Java");
        map.put(1, "Python");
        map.put(2, "C++");
        System.out.println(map);
    }
}

輸出:

{1=Python, 2=C++, 3=Java}

即使插入順序:

3 1 2

結(jié)果仍然自動排序。

五、TreeMap 字符串排序

import java.util.TreeMap;
public class Demo {
    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<>();
        map.put("banana", 1);
        map.put("apple", 2);
        map.put("cat", 3);
        System.out.println(map);
    }
}

輸出:

{apple=2, banana=1, cat=3}

按照字母順序排序。

六、TreeMap 自定義排序

TreeMap 可以通過:

Comparator 比較器

實(shí)現(xiàn)自定義排序。

示例:降序排序

import java.util.Comparator;
import java.util.TreeMap;
public class Demo {
    public static void main(String[] args) {
        TreeMap<Integer, String> map =
                new TreeMap<>(Comparator.reverseOrder());
        map.put(1, "A");
        map.put(3, "C");
        map.put(2, "B");
        System.out.println(map);
    }
}

輸出:

{3=C, 2=B, 1=A}

七、TreeMap 自定義對象排序

如果 key 是對象,則必須實(shí)現(xiàn):

  • Comparable
  • Comparator

否則會報(bào)錯。

示例:學(xué)生年齡排序

Student 類

class Student {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return name + "-" + age;
    }
}

使用 Comparator

import java.util.Comparator;
import java.util.TreeMap;
public class Demo {
    public static void main(String[] args) {
        TreeMap<Student, String> map =
                new TreeMap<>((o1, o2) -> o1.age - o2.age);
        map.put(new Student("張三", 18), "Java");
        map.put(new Student("李四", 20), "Python");
        map.put(new Student("王五", 19), "C++");
        System.out.println(map);
    }
}

輸出:

{張三-18=Java, 王五-19=C++, 李四-20=Python}

八、LinkedHashMap 與 TreeMap 對比

對比項(xiàng)LinkedHashMapTreeMap
是否有序按插入順序自動排序
底層結(jié)構(gòu)Hash表 + 雙向鏈表紅黑樹
查詢效率O(1)O(log n)
是否允許 null key允許不允許
使用場景記錄順序排序需求

九、如何選擇?

使用 LinkedHashMap

  • 需要保持插入順序
  • 最近訪問記錄
  • LRU緩存
  • 瀏覽歷史

例如:

最近播放歌曲
最近瀏覽商品

使用 TreeMap

  • 自動排序
  • 排行榜
  • 成績排序
  • 字典排序

例如:

學(xué)生成績排名
商品價(jià)格排序

十、小tips

1. LinkedHashMap 和 HashMap 區(qū)別?

LinkedHashMap:

  • 有順序
  • 多了雙向鏈表

HashMap:

  • 無序
  • 純哈希結(jié)構(gòu)

2. TreeMap 為什么能排序?

因?yàn)榈讓邮?strong>紅黑樹

插入元素時(shí)會自動比較 key。

3. TreeMap 為什么不能為 null?

因?yàn)榕判驎r(shí)需要比較 key:

compareTo()

null 無法比較。

4. LinkedHashMap 為什么適合做緩存?

因?yàn)樗С郑?/p>

訪問順序

最近訪問的數(shù)據(jù)會移動到尾部。

這正符合:

LRU(使用少)

緩存淘汰策略。

十一、總結(jié)

LinkedHashMap

核心關(guān)鍵詞:

有序
插入順序
雙向鏈表
緩存

適合:

既想要 HashMap 的效率,又想保持順序。

TreeMap

核心關(guān)鍵詞:

自動排序
紅黑樹
比較器
有序Map

適合:

需要按 key 自動排序的場景。

十二、用一張圖來表示三種map

Map
├── HashMap
│     ├── 無序
│     └── 查詢快
│
├── LinkedHashMap
│     ├── 有序
│     ├── 雙向鏈表
│     └── 適合緩存
│
└── TreeMap
      ├── 自動排序
      ├── 紅黑樹
      └── 適合排行榜

真正掌握集合框架后,其實(shí)我們會發(fā)現(xiàn):

Java 集合本質(zhì)就是:

“數(shù)據(jù)結(jié)構(gòu) + 算法思想” 的具體實(shí)現(xiàn)。

到此這篇關(guān)于Java LinkedHashMap與TreeMap的文章就介紹到這了,更多相關(guān)Java LinkedHashMap與TreeMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java垃圾回收機(jī)制簡述

    Java垃圾回收機(jī)制簡述

    這篇文章主要為大家詳細(xì)介紹了Java垃圾回收機(jī)制的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java中字符串常見題之String相關(guān)講解

    Java中字符串常見題之String相關(guān)講解

    今天小編就為大家分享一篇關(guān)于Java中字符串常見題之String相關(guān)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 老生常談Java中instanceof關(guān)鍵字的理解

    老生常談Java中instanceof關(guān)鍵字的理解

    java 中的instanceof 運(yùn)算符是用來在運(yùn)行時(shí)指出對象是否是特定類的一個(gè)實(shí)例。這篇文章主要介紹了老生常談Java中instanceof關(guān)鍵字的理解,需要的朋友可以參考下
    2018-10-10
  • 詳解java 中Spring jsonp 跨域請求的實(shí)例

    詳解java 中Spring jsonp 跨域請求的實(shí)例

    這篇文章主要介紹了詳解java 中Spring jsonp 跨域請求的實(shí)例的相關(guān)資料,jsonp 可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題,需要的朋友可以參考下
    2017-08-08
  • 淺談Java中格式化輸出

    淺談Java中格式化輸出

    這篇文章主要介紹了Java中格式化輸出,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java優(yōu)雅實(shí)現(xiàn)判空方法(結(jié)合實(shí)際案例)

    Java優(yōu)雅實(shí)現(xiàn)判空方法(結(jié)合實(shí)際案例)

    相信寫過代碼的朋友們都會進(jìn)行一個(gè)非空判斷,但是各種非空判斷中,那種才是最優(yōu)雅,最高效的呢,這篇文章主要介紹了Java優(yōu)雅實(shí)現(xiàn)判空方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Spring Boot 中PageHelper 插件使用配置思路詳解

    Spring Boot 中PageHelper 插件使用配置思路詳解

    這篇文章主要介紹了Spring Boot 中PageHelper 插件使用配置及實(shí)現(xiàn)思路,通過引入myabtis和pagehelper依賴,在yml中配置mybatis掃描和實(shí)體類,具體實(shí)現(xiàn)方法跟隨小編一起看看吧
    2021-08-08
  • Java切割字符串的踩坑實(shí)戰(zhàn)記錄

    Java切割字符串的踩坑實(shí)戰(zhàn)記錄

    最近在項(xiàng)目中使用了java中的分割字符串,踩了一個(gè)坑,充分了展示了自己對java底層的認(rèn)知有很多的不足和欠缺,下面這篇文章主要給大家介紹了關(guān)于Java切割字符串的踩坑實(shí)戰(zhàn)記錄,需要的朋友可以參考下
    2022-11-11
  • jackson設(shè)置返回null為空字符串的操作

    jackson設(shè)置返回null為空字符串的操作

    這篇文章主要介紹了jackson設(shè)置返回null為空字符串的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • springboot統(tǒng)一異常處理(返回json)并格式化異常

    springboot統(tǒng)一異常處理(返回json)并格式化異常

    這篇文章主要介紹了springboot統(tǒng)一異常處理(返回json)并格式化異常,對spring boot的默認(rèn)異常處理方式進(jìn)行修改,要統(tǒng)一返回?cái)?shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開發(fā)應(yīng)用,需要的朋友可以參考下
    2023-07-07

最新評論

河北省| 兴安县| 固安县| 郎溪县| 名山县| 土默特右旗| 长宁区| 咸丰县| 康乐县| 龙井市| 庆安县| 南阳市| 耒阳市| 峨眉山市| 本溪市| 铁岭县| 永新县| 临汾市| 永德县| 宿迁市| 科尔| 墨竹工卡县| 斗六市| 临高县| 东阿县| 夏河县| 三明市| 桐梓县| 宁夏| 定襄县| 莱阳市| 大关县| 盐池县| 马鞍山市| 卓尼县| 黄大仙区| 永定县| 新沂市| 靖江市| 巴里| 丘北县|