Java集合 —— Map集合

2023-10-26

1、 Map接口和Collection接口的不同:

  • 它们两个不存在继承关系,都是属于java.util包下面的平级关系
  • Map集合存储的元素都是成对出现的,Map元素的键是唯一的,值是可以重复。把这样的元素理解为:夫妻对
  • Collection集合存储的元素都是单独出现的,Collection接口下面的Set是元素唯一的, List集合中元素是可以重复的。
    这样的单独出现的元素,可以理解为单身

2、 Map集合的特点:

  • 将键映射到值的对象、
  • key和value可以是任意的引用类型的数据
  • 一个映射不能包含重复的键(map集合的key值不能重复)
  • 每个键最多可以映射到一个值(每个键值对只有一个key值,一个value值)
  • 同样的值可以对应多个不同的键(不同的键值对可以拥有相同的value值)

3、 Map集合的功能:

1、添加功能: put(K key,V value)将指定的值与该映射中的指定键相关联

2、删除功能:
remove(Object key)如果存在,从该map集合中删除一个键的映射
void clear()从该map集合中删除所有的映射

3、长度功能:int size()返回此地图中键值映射的数量

4、HashMap原理

谈谈你对HashMap的理解?

先从底层数据出发。HashMap实现Map接口,存储键值对。JDK8版本底层结构基于数组+链表/红黑树,当每个桶中元素达到树化阈值8,并且数组总量大于64,由链表转为红黑树;元素小于阈值6,转回链表。针对JDK7版本做了优化,将最坏查询由O(n)降到O(logn)。

其次,HashMap线程不安全。

HashMap的数据插入原理是怎样的?

在这里插入图片描述

点击连接 HashMap面试题大全,兄弟姐妹们背起来

5、HashTable特点

HashTable的继承树如下图:
在这里插入图片描述
(1)底层使用Entry数组保存元素

(2)默认初始容量是11,加载因子是0.75。

    /**
     * Constructs a new, empty hashtable with a default initial capacity (11)
     * and load factor (0.75).
     */
    public Hashtable() {
        this(11, 0.75f);
    }

(3)可以指定初始容量和加载因子。指定初始容量时即按照指定值进行容量分配。

	public Hashtable(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal Load: "+loadFactor);

        if (initialCapacity==0)
            initialCapacity = 1;
        this.loadFactor = loadFactor;
        table = new Entry<?,?>[initialCapacity];
        threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
    }
    
    public Hashtable(int initialCapacity) {
        this(initialCapacity, 0.75f);
    }

(4)线程安全,方法使用synchronized修饰。

(5)具有fail-fast的特征

(6)key和value均不允许为null,否则抛出java.lang.NullPointerException异常。

(7)计算索引的方式为:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

(8)如果key已经存在,则新value覆盖旧value,并返回旧value

public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }

        addEntry(hash, key, value, index);
        return null;
    }

(9)如果超过扩容阈值threshold(数组容量 * 加载因子),则进行rehash扩容。新数组容量=(原数组容量 << 1) + 1

6、LinkedHashMap

扩展HashMap增加双向链表的实现,号称是最占内存的数据结构。支持iterator()时按Entry的插入顺序来排序(但是更新不算, 如果设置accessOrder属性为true,则所有读写访问都算)。

实现上是在Entry上再增加属性before/after指针,插入时把自己加到Header Entry的前面去。如果所有读写访问都要排序,还要把前后Entry的before/after拼接起来以在链表中删除掉自己。

7、TreeMap

以红黑树实现,篇幅所限详见入门教程。支持iterator()时按Key值排序,可按实现了Comparable接口的Key的升序排序,或由传入的Comparator控制。可想象的,在树上插入/删除元素的代价一定比HashMap的大。

支持SortedMap接口,如firstKey(),lastKey()取得最大最小的key,或sub(fromKey, toKey), tailMap(fromKey)剪取Map的某一段。

8、ConcurrentHashMap

并发优化的HashMap,默认16把写锁(可以设置更多),有效分散了阻塞的概率,而且没有读锁。

数据结构为Segment[],Segment里面才是哈希桶数组,每个Segment一把锁。Key先算出它在哪个Segment里,再算出它在哪个哈希桶里。

支持ConcurrentMap接口,如putIfAbsent(key,value)与相反的replace(key,value)与以及实现CAS的replace(key, oldValue, newValue)。

没有读锁是因为put/remove动作是个原子动作(比如put是一个对数组元素/Entry 指针的赋值操作),读操作不会看到一个更新动作的中间状态。

9、ConcurrentSkipListMap

JDK6新增的并发优化的SortedMap,以SkipList实现。SkipList是红黑树的一种简化替代方案,是个流行的有序集合算法,篇幅所限见入门教程。Concurrent包选用它是因为它支持基于CAS的无锁算法,而红黑树则没有好的无锁算法。
很特殊的,它的size()不能随便调,会遍历来统计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java集合 —— Map集合 的相关文章

随机推荐

  • matlab 集成学习方法,集成学习(ensemble learning)

    本章参考西瓜书第八章编写 从个体和集成之间的关系出发 引出了集成学习的遵循的两大标准 基学习器的准确定和多样性 然后开始介绍具体的集成学习算法 串行的Boosting和并行的Bagging 前者通过对错判训练样本重新赋权来重复训练 以提高基
  • 统计机器学习---主成分分析(PCA)

    主成分分析的基本了解 主成分分析方法 是一种使用最广泛的数据降维算法 PCA的主要思想是将高维的特征映射到k维上 这k维就是主成分 并能保留原始变量的大部分信息 这里的信息是指原始变量的方差 如果用坐标系进行直观解释 一个坐标系表示一个变量
  • Air724+HC32L176做的电能集中器——JSY-1039单相4G集中器

    很多朋友在很多地方都听到过 集中器 但是对集中器还没有隔概念 那么什么是集中器呢 问 什么是集中器 集中器 concentrator device 是连接终端 计算机或通信设备的中心连接点设备 它成为电缆汇合的中心点 在若干终端密集区内 通
  • virtualbox 主机ping不通虚拟机解决办法

    场景描述 virtualbox虚拟机可以ping通主机和外网 但是主机一直无法ping通虚拟机ip 10 0 2 15 虚拟机的网络设置为nat 自己添加的nat网络 这样可以使得不通的虚拟机ip不一样 否则都选择NAT网络地址转发这个选项
  • 用deconstructSigs来做cosmic的mutation signature图

    用deconstructSigs来做cosmic的mutation signature图 作者的英文文档对这个包的用法描述的非常清楚 我只是记录一下自己学习该包用法的一点感悟 安装并加载必须的packages 如果你还没有安装 就运行下面的
  • Mac电脑使用:桌面底部莫名出现白色输入框解决的解决办法

    转自 https blog csdn net CC1991 article details 82965981 关闭Finder快速搜索输入框的方法 用鼠标单击输入框 点击进去 然后按电脑键盘的 Esc 键 即可关闭这个输入框
  • 离散特征和连续特征混合_混合蛋白和特征

    Java语言的开发人员精通C 和其他包含多重继承的语言 从而使类可以从任意数量的父级继承 多重继承的问题之一是无法确定派生自哪个父继承功能 这个问题称为菱形问题 请参阅参考资料 多重继承中固有的菱形问题和其他复杂性启发了Java语言设计人员
  • Docker 进入启动容器

    在使用 d参数时 容器启动后会进入后台 用户无法看到容器中的信息 也无法进行操作 这个时候如果需要进入容器进行操作 有多种方法 包括使用官方的attach或exec命令 以及第三方的nsenter工具等 1 attach命令 attach命
  • Linux下载及配置

    方法一 我们可以来到vm ware的官网 下载一个vm ware16 pro的模拟器 之后在下载完vm ware之后 我们可以去到centOS的官网 下载一个centOS 当然你也可以选择其他的linux的发行版 当然官网的下载速度是很慢的
  • MATLAB 绘制动态正弦函数

    一 动态正弦函数 动态正弦函数 二 MATLAB 绘制动态正弦函数代码 clear clc close all Np 100 空间点数 dx 2 pi Np 步长 x 0 dx 6 pi x 范围 f1sin sin x f1cos cos
  • LVGL视频课程更新啦,基于lvgl v8.2版本,课程适配多个平台、多款板子

    视频教程观看 百问网LVGL v8 系列课程 韦东山 监制 教程基于lvgl v8 2版本 课程适配多个平台 多款板子 百问网LVGL v8 视频课程 韦东山 监制 教程基于lvgl v8 2版本 课程适配多个平台 多款板子 视频学习地址
  • mysql集群 配置Keepalived+mm

    集团公司已经在oracle方向有成熟的几十套环境 但是为了节约成本 要尝试下mysql下面先用两台linux x86 Red Hat Enterprise Linux Server release 5 4 Tikanga 和linux6 3
  • O-RAN专题系列-37:管理面-WG4.MP.V07-规范解读-第3章-启动安装流程:NETCONF会话的建立、维护、关闭

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122498392 目录 第3章 Sta
  • 计算机硬件基础——第一章:计算机系统概述

    目录 计算机发展历史 第一代 电子管计算机时代 1946 1957 其主要特点是采用电子管作为基本器件 第二代 晶体管计算机时代 1958 1964 这时期计算机的主要器件逐步由电子管改为晶体管 第三代 集成电路计算机时代 1965 197
  • 旧视频调整为4k视频提高分辨率Topaz Video Enhance AI

    Topaz Video Enhance AI是Mac上的提升视频分辨率的工具 也是拍摄出色画面 并将其变得完美方法 借助软件Topaz Video Enhance AI 可以将您的素材从标清转换为高清 并不会发生模糊 且会得到质量的提升 非
  • Java并发编程系列 - 互斥锁:解决原子性问题

    Java并发编程系列 互斥锁 解决原子性问题 原子的意思代表着 不可分 那么如果我们要保证原子性就必须满足 同一时刻只有一个线程执行 称之为互斥 如果我们能够保证对 共享变量的修改是互斥的 那么 无论是单核 CPU 还是多核 CPU 就都能
  • Elasticsearch框架基础概念

    Elasticsearch ES 是一个基于Lucene构建开源分布式搜索引擎并提供Restful接口 Es是一个分布式文档数据库 JSON数据格式存储 类似MongoDB JSON中的每个字段数据都可作为搜索条件 并且能够扩展至数以百计的
  • Mysql查询数据库表中前几条记录

    Mysql查询数据库表中前几条记录问题 我想好多朋友也会碰到 下面我简单的说下我遇到的情况 且解决方法 希望对好多朋友有许多帮助 下面是我数据库test中表student的数据 其中第二条记录被我删除了 在查询分析器中输入select fr
  • Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程 内涵完整文件和代码 相关链接 超详细 CNN卷积神经网络教程 零基础到实战 大白话pytorch基本知识点及语法 项目实战 文章目录 基于pytorch的深度学习花朵种类识别项目完整教程
  • Java集合 —— Map集合

    目录 1 Map接口和Collection接口的不同 2 Map集合的特点 3 Map集合的功能 4 HashMap原理 谈谈你对HashMap的理解 HashMap的数据插入原理是怎样的 5 HashTable特点 6 LinkedHas