LinkedHashMap<K, V>

LinkedHashMap<K, V> 是 Java 集合框架中的一个重要类,它继承自 HashMap<K, V>,同时实现了 Map<K, V> 接口。下面从多个方面详细介绍 LinkedHashMap<K, V>

特性

  1. 键值对存储:和 HashMap 一样,LinkedHashMap 以键值对(key - value)形式存储数据,每个键是唯一的,键和值都可以为 null
  2. 有序性:这是 LinkedHashMap 区别于 HashMap 的关键特性。它可以保持插入顺序或者访问顺序。插入顺序指的是元素按照插入的先后顺序排列;访问顺序指的是每次访问(如 get 操作)一个元素后,该元素会被移动到链表尾部,最久未被访问的元素在链表头部。
  3. 基于哈希表和双向链表实现LinkedHashMap 内部维护了一个双向链表,用于记录元素的顺序,同时使用哈希表来实现快速的键值查找。

构造方法

  1. LinkedHashMap():创建一个默认初始容量为 16,负载因子为 0.75,按照插入顺序排序的空 LinkedHashMap
import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
    }
}

  1. LinkedHashMap(int initialCapacity):创建一个指定初始容量,负载因子为 0.75,按照插入顺序排序的空 LinkedHashMap
LinkedHashMap<String, Integer> map = new LinkedHashMap<>(32);

  1. LinkedHashMap(int initialCapacity, float loadFactor):创建一个指定初始容量和负载因子,按照插入顺序排序的空 LinkedHashMap
LinkedHashMap<String, Integer> map = new LinkedHashMap<>(32, 0.8f);

  1. LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder):创建一个指定初始容量、负载因子和排序方式的空 LinkedHashMap。当 accessOrdertrue 时,按照访问顺序排序;为 false 时,按照插入顺序排序。
LinkedHashMap<String, Integer> map = new LinkedHashMap<>(32, 0.8f, true);

  1. LinkedHashMap(Map<? extends K, ? extends V> m):创建一个包含指定 Map 中所有键值对,按照插入顺序排序的 LinkedHashMap
import java.util.HashMap;
import java.util.Map;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> anotherMap = new HashMap<>();
        anotherMap.put("apple", 1);
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>(anotherMap);
    }
}

常用方法

LinkedHashMap 继承了 HashMap 的大部分方法,同时也有一些自身的特点,以下是一些常用方法:

  1. 插入和更新操作put(K key, V value):将指定的键值对插入到 LinkedHashMap 中。如果键已经存在,则更新该键对应的值。返回该键之前关联的值,如果键不存在则返回 null。
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
Integer oldValue = map.put("apple", 1);

- **`putAll(Map<? extends K, ? extends V> m)`**:将指定 `Map` 中的所有键值对复制到当前 `LinkedHashMap` 中。

Map<String, Integer> anotherMap = new HashMap<>();
anotherMap.put("banana", 2);
map.putAll(anotherMap);

  1. 删除操作remove(Object key):从 LinkedHashMap 中移除指定键对应的键值对。返回该键关联的值,如果键不存在则返回 null。
Integer removedValue = map.remove("apple");

  1. 查询操作get(Object key):返回指定键关联的值,如果键不存在则返回 null。当 accessOrder 为 true 时,该操作会将访问的元素移动到链表尾部。
Integer value = map.get("apple");

- **`containsKey(Object key)`**:判断 `LinkedHashMap` 中是否包含指定的键,包含返回 `true`,否则返回 `false`。

boolean hasKey = map.containsKey("apple");

- **`containsValue(Object value)`**:判断 `LinkedHashMap` 中是否包含指定的值,包含返回 `true`,否则返回 `false`。

boolean hasValue = map.containsValue(1);

- **`size()`**:返回 `LinkedHashMap` 中键值对的数量。

int size = map.size();

  1. 遍历操作entrySet():返回一个包含 LinkedHashMap 中所有键值对的 Set 视图,每个键值对用 Map.Entry<K, V> 对象表示。遍历该 Set 可以按照插入顺序或访问顺序获取键值对。
import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapTraversal {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("Key: " + key + ", Value: " + value);
        }
    }
}

应用场景

  1. 缓存实现:由于 LinkedHashMap 可以按照访问顺序排序,因此可以很方便地实现 LRU(Least Recently Used,最近最少使用)缓存。当缓存满时,移除链表头部最久未被访问的元素。
import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int capacity;

    public LRUCache(int capacity) {
        super(capacity, 0.75f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                return size() > capacity;
            }
        };
        this.capacity = capacity;
    }

    public static void main(String[] args) {
        LRUCache<String, Integer> cache = new LRUCache<>(3);
        cache.put("apple", 1);
        cache.put("banana", 2);
        cache.put("cherry", 3);
        System.out.println(cache); 
        cache.get("apple");
        System.out.println(cache); 
        cache.put("date", 4);
        System.out.println(cache); 
    }
}

注意事项

  1. 性能LinkedHashMap 的插入、删除和查找操作的时间复杂度与 HashMap 相同,都是 O(1)。但由于需要维护双向链表,会有一些额外的开销。
  2. 线程安全LinkedHashMap 不是线程安全的,如果需要在多线程环境下使用,可以考虑使用 Collections.synchronizedMap 方法将其包装成线程安全的 Map
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

Map<String, Integer> synchronizedMap = Collections.synchronizedMap(new LinkedHashMap<>());

综上所述,LinkedHashMap 是一个非常实用的集合类,适合需要保持元素顺序的场景,尤其是实现缓存时非常方便。

Java集合框架 文章被收录于专栏

Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。

全部评论

相关推荐

Flutter&nbsp;概述:https://www.nowcoder.com/issue/tutorial?zhuanlanId=j572L2&amp;amp;uuid=daaad000ae7e4348a2f815e87e8880ccFlutter&nbsp;是一个由&nbsp;Google&nbsp;开发的开源&nbsp;UI&nbsp;软件开发工具包,主要用于构建高性能的跨平台应用程序。它支持&nbsp;Android、iOS、Web&nbsp;以及桌面应用(包括&nbsp;Windows&nbsp;和&nbsp;macOS)。Flutter&nbsp;的核心特点包括:快速开发:通过热重载(Hot&nbsp;Reload)功能,开发者可以在不重启应用的情况下实时查看对代码所做的更改。高性能:Flutter&nbsp;应用直接编译成原生代码,利用&nbsp;GPU&nbsp;渲染,从而实现高性能的用户界面。丰富的组件:Flutter&nbsp;提供了一整套高度可定制的&nbsp;Material&nbsp;Design&nbsp;和&nbsp;Cupertino&nbsp;组件,支持不同平台的原生外观。单一代码库:开发者只需使用一套&nbsp;Dart&nbsp;语言编写代码,即可同时面向多个平台,降低了开发和维护成本。Windows&nbsp;或&nbsp;macOS&nbsp;环境搭建1.&nbsp;Windows&nbsp;环境搭建步骤&nbsp;1:系统要求确保你的&nbsp;Windows&nbsp;计算机符合以下要求:Windows&nbsp;7&nbsp;SP1&nbsp;或更高版本(64&nbsp;位)可用的磁盘空间:至少&nbsp;1.5&nbsp;GB(不包括&nbsp;IDE/编辑器)运行开发工具需要安装&nbsp;Visual&nbsp;Studio(包含&nbsp;C++&nbsp;开发工具)步骤&nbsp;2:下载&nbsp;Flutter&nbsp;SDK访问&nbsp;Flutter&nbsp;官方网站。在下载页面选择&nbsp;Windows&nbsp;版本,下载&nbsp;Flutter&nbsp;SDK&nbsp;的压缩包。解压下载的文件到你选择的路径(如&nbsp;C:\src\flutter)。确保该路径没有空格或非&nbsp;ASCII&nbsp;字符。
点赞 评论 收藏
分享
柠檬微趣面经1.&nbsp;游戏客户端开发实习(2026届)面试流程:笔试&nbsp;→&nbsp;一面&nbsp;→&nbsp;二面&nbsp;→&nbsp;三面(加面)&nbsp;→&nbsp;HR面(通过)笔试:4道编程题(LeetCode中等难度)面试重点:一面:-&nbsp;指针大小、指针和引用的区别-&nbsp;`#include&amp;amp;lt;&amp;amp;gt;`和`include&amp;amp;quot;&amp;amp;quot;`的区别-&nbsp;哈希表&nbsp;vs&nbsp;二叉树适用场景-&nbsp;手撕算法:DFS、前缀和-&nbsp;智力题:飞机飞行时差问题二面:-&nbsp;二叉树遍历(题目理解错误,调整后正确)-&nbsp;计算时针和分针夹角(紧张算错,后修正)-&nbsp;链表相交情况分析(画图)三面(加面):-&nbsp;0、1互换的多种方法(一面重复问)-&nbsp;链表相关题目(口述思路)HR面:常规问题,顺利通过面试体验:面试官友好,流程快,部分题目重复考察。2.&nbsp;C++后台开发(2025届)面试流程:笔试&nbsp;→&nbsp;一面(挂)笔试:4道编程题(二叉树、字符串处理、数组有序对)面试重点:一面:-&nbsp;进程通信(信号、共享内存)-&nbsp;TCP三次握手/四次挥手(TIMEWAIT作用)-&nbsp;虚函数原理(虚表指针存储位置)-&nbsp;同步&nbsp;vs&nbsp;异步、阻塞&nbsp;vs&nbsp;非阻塞-&nbsp;笔试复盘(优化最大有序对长度算法)面试体验:基础不扎实导致挂掉,面试官追问深入细节。柠檬微趣2025届校招&amp;amp;amp;26届实习进行中【招聘动态】研发类、数据类、策划类三大岗位仍有较多机会,欢迎投递【关于我们】中国领先的手机休闲游戏开发商和运营商之一,研发发行的爆款游戏有《宾果消消消》、《浪漫餐厅》等,柠檬微趣已成为合成手游赛道全球收入最高发行商!【福利待遇】-&nbsp;北京户口指标、一年免费住宿-&nbsp;七险一金、丰厚年终奖、免费早晚餐-&nbsp;带薪年假、带薪全员旅游、年度体检-&nbsp;社团活动、生日礼物、水果下午茶⭐【内推链接】https://app.mokahr.com/su/lodoap【内推码】NTA0tU4(简历优先筛选,后续疑问/流程问题欢迎联系)大家投递完可以在评论区打上姓名缩写+岗位,我来确认有没有内推成功喽 #春招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#实习#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推码#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#柠檬微趣#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务