LinkedHashMap的有序属性

LinkedHashMap是Java提供的一种Map集合类型,继承于HashMap并实现了Map接口和双向链表数据结构。相比HashMap,它可以在保持快速查找的同时,保证迭代顺序和插入顺序是一致的。这就意味着它是有序的。

一、keyset有序吗

LinkedHashMap的keyset是有序的,输出顺序和插入顺序一致。其实这个也是由双向链表的结构所决定的,因为每一个元素在插入的时候都会被封装成为Entry类型,并存储在一个双向链表中,因此在访问keyset的时候,就会按照链表的顺序返回。

    LinkedHashMap map = new LinkedHashMap();
    map.put("apple", 1);
    map.put("pear", 2);
    map.put("banana", 3);
    for (String key : map.keySet()) {
        System.out.println(key);
    }
    // 输出结果为:
    // apple
    // pear
    // banana

二、LinkedHashMap有序遍历

如果需要遍历整个LinkedHashMap,我们可以使用entrySet()方法,该方法会返回一个有序的集合,里面包含了所有的Entry元素,然后我们可以根据entry的key和value进行相应的操作。

    LinkedHashMap map = new LinkedHashMap();
    map.put("apple", 1);
    map.put("pear", 2);
    map.put("banana", 3);
    for (Map.Entry entry : map.entrySet()) {
        System.out.println(entry.getKey() +" - "+ entry.getValue());
    }
    // 输出结果为:
    // apple - 1
    // pear - 2
    // banana - 3

三、ConcurrentHashMap有序吗

相比之下,ConcurrentHashMap是没有顺序保障的。虽然它内部也有一个对于迭代顺序有保障的结构类似于Segment,不过ConcurrentHashMap为了支持高并发,限制了各种锁的范围,导致它无法对于整个Map进行顺序的保证。

四、LinkedHashMap有序还是无序

LinkedHashMap是有序的,这可以从其构造函数中第三个参数accessOrder为true时得到体现。如果该参数的值为true,则在对Map中的元素进行get()、put()、putAll()操作时,都会将元素移到最后一个位置,因此访问顺序也可以通过这个方式被保证。

    LinkedHashMap map = new LinkedHashMap(16, 0.75f, true);
    map.put("apple", 1);
    map.put("pear", 2);
    map.put("banana", 3);
    map.get("apple"); // 让apple成为最后访问的元素
    for (String key : map.keySet()) {
        System.out.println(key);
    }
    // 输出结果为:
    // pear
    // banana
    // apple

五、LinkedHashMap为什么有序

LinkedHashMap之所以有序,是因为在Map中维护了一个双向链表,他被称为记录插入顺序或者访问顺序。这个双向链表记录了每一个元素的插入或访问顺序,所以每次遍历都是按照这个顺序进行的。如果我们需要改变这个顺序,可以使用accessOrder参数设置,该参数会让LinkedHashMap在对元素进行get()、put()、putAll()操作时将元素移到最后一个位置,这样就保证了遍历顺序。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/291026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-24 13:13
下一篇 2024-12-24 13:13

相关推荐

  • Vant ContactList 增加属性的实现方法

    在使用前端UI框架Vant中的ContactList组件时,我们有时需要为此组件增加一些个性化的属性,来满足我们特定的需求。那么,如何实现ContactList组件的增加属性功能呢…

    编程 2025-04-29
  • 全面解读数据属性r/w

    数据属性r/w是指数据属性的可读/可写性,它在程序设计中扮演着非常重要的角色。下面我们从多个方面对数据属性r/w进行详细的阐述。 一、r/w的概念 数据属性r/w即指数据属性的可读…

    编程 2025-04-29
  • 使用PHP foreach遍历有相同属性的值

    本篇文章将介绍如何使用PHP foreach遍历具有相同属性的值,并给出相应的代码示例。 一、基础概念 在讲解如何使用PHP foreach遍历有相同属性的值之前,我们需要先了解几…

    编程 2025-04-28
  • PowerDesigner批量修改属性

    本文将教您如何使用PowerDesigner批量修改实体、关系等对象属性。 一、选择要修改的对象 首先需要打开PowerDesigner,并选择要修改属性的对象。可以通过以下两种方…

    编程 2025-04-27
  • 子类 builder() 没有父类的属性

    本文将从以下几个方面对子类 builder() 缺少父类属性进行详细阐述: 一、Subclassing with the Builder Pattern 在实现 builder 模…

    编程 2025-04-27
  • Python中的delattr:一个多功能的属性删除方法

    在Python编程中,delattr()是一个十分强大常用的函数,可以方便的删除一个对象的属性,并且使用起来非常灵活。接下来将从多个方面详细阐述Python中的delattr()方…

    编程 2025-04-27
  • JavaScript中修改style属性的方法和技巧

    一、基本概念和方法 style属性是JavaScript中一个非常重要的属性,它可以用来控制HTML元素的样式,包括颜色、大小、字体等等。这里介绍一些常用的方法: 1、通过Java…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • display属性的多方位应用

    一、display属性概述 display属性是CSS中常用的一个属性,它定义了一个元素的盒模型类型,以及其在页面上的布局形式。在HTML文档中,每个HTML标签都有一个默认的di…

    编程 2025-04-23
  • 微信小程序image属性详解

    微信小程序开发以其轻量、高效、便利为特点,深受开发者喜爱。image属性作为基础组件之一,在开发过程中也扮演着重要的角色。本文将从微信小程序image显示不出来、微信小程序imag…

    编程 2025-04-23

发表回复

登录后才能评论