Java开发基础系列(十四):集合对象(Map)

news2024/9/23 23:33:40
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: Java开发基础系列(十三):集合对象(Map)
⏱️ @ 创作时间: 2023年07月28日

在这里插入图片描述

目录

  • 前言
  • Map实现类
  • 常用方法
  • 特殊用法
    • WeakHashMap
    • LinkedHashMap
    • EnumMap

前言

什么是Map:

Map集合是Java中一种用于存储键值对的数据结构。它提供了一种将键映射到值的方式,每个键对应一个唯一的值。Map中的键是唯一的,但值可以重复。

Map中,可以通过键来快速检索对应的值,这使得Map非常适合处理需要根据给定的键来查找、更新和删除相关值的情况。例如,可以使用学生的学号作为键,将学生的信息作为值进行存储。

Map接口是Java中定义Map集合的顶级接口,它提供了一系列操作Map的方法。常用的Map实现类有HashMap、TreeMap和LinkedHashMap等。这些具体的实现类基于不同的数据结构,在性能和特性方面有所差异,可以根据需求选择适合的实现类。

总和来说,Map集合是一种存储键值对的数据结构,通过键来快速访问和操作对应的值。它提供了丰富的方法来增加、删除、修改和查询键值对,是Java中常用的数据结构之一。

Map的常见用途包括:

  • 数据的存储和检索:Map可以用来存储大量的数据,并通过键来快速查找对应的值,例如将学生的学号映射到他们的成绩上。
  • 缓存机制:Map可以用作缓存的数据结构,将计算结果或者重要的数据存储在其中,以便后续使用。这样可以避免重复计算或者频繁地进行IO操作。
  • 统计信息:Map可以用于统计某些数据的数量或者频率,例如统计一段文本中每个单词出现的次数。

Map实现类

  • HashMap:HashMap是基于哈希表的Map实现类,它通过哈希函数将键映射到存储位置。它提供了快速插入、查找和删除操作,并且不保证元素的顺序。
  • TreeMap:TreeMap是基于红黑树的有序Map实现类,它会对键进行排序并保持有序状态。TreeMap具有按照键的自然顺序或者自定义顺序来访问键值对的能力。
  • LinkedHashMap:LinkedHashMap基于哈希表和双向链表的Map实现类,它保留了元素插入的顺序。LinkedHashMap可以用作LRU(最近最少使用)缓存,以便在缓存满时移除最不常访问的元素。
  • EnumMap:EnumMap是专门用于枚举类型键的Map实现类,它要求所有的键都必须属于同一个枚举类型。EnumMap内部使用数组实现,因此其性能高效。
  • WeakHashMap:WeakHashMap是一种特殊的Map实现类,它的键是弱引用(WeakReference),在没有其他强引用指向键时,可以被垃圾回收器回收。

常用方法

以下是常用的使用方法,以HashMap为:

  • put(key, value)
    向Map中添加一个键值对,如果该键已存在,则会替换旧的值。
    Map<String, Integer> map = new HashMap<>();
    map.put("A", 25);
    map.put("B", 30);
    map.put("C", 28);
    
  • get(key)
    根据给定的键获取对应的值。
    int aliceAge = map.get("Alice");
    System.out.println("Alice的年龄是:" + aliceAge);
    
  • containsKey(key)
    判断Map中是否包含指定的键。
    boolean containsA = map.containsKey("A");
    System.out.println("是否包含A:" + containsA );
    
  • containsValue(value)
    判断Map中是否包含指定的值。
    boolean containsAge30 = map.containsValue(30);
    System.out.println("是否包含30:" + containsAge30);
    
  • remove(key)
    根据给定的键删除对应的键值对。
map.remove("B");
  • size()
    返回Map中键值对的数量。

    int size = map.size();
    System.out.println("Map中的键值对数量:" + size);
    
  • isEmpty()
    判断Map是否为空。

    boolean empty = map.isEmpty();
    System.out.println("Map是否为空:" + empty);
    
  • keySet()
    返回Map中所有键的集合。

    Set<String> keys = map.keySet();
    for (String key : keys) {
        System.out.println("键:" + key);
    }
    
  • values()
    返回Map中所有值的集合。

    Collection<Integer> values = map.values();
    for (int value : values) {
        System.out.println("值:" + value);
    }
    
  • entrySet()
    返回Map中所有键值对的集合,进行遍历Map。

    Set<Map.Entry<String, Integer>> entries = map.entrySet();
    for (Map.Entry<String, Integer> entry : entries) {
        String key = entry.getKey();
        int value = entry.getValue();
        System.out.println("键:" + key + ",值:" + value);
    }
    
  • clear():
    清空Map,移除所有的键值对。

    map.clear();
    
  • putAll(map):
    将另一个Map的键值对全部添加到当前Map中。

    Map<String, Integer> anotherMap = new HashMap<>();
    anotherMap.put("D", 35);
    anotherMap.put("E", 32);
    
    map.putAll(anotherMap);
    
  • getOrDefault(key, defaultValue)
    根据给定的键获取对应的值,如果键不存在,则这只一个默认值并且返回。

    int h = map.getOrDefault("H", 0);
    System.out.println("H的值是:" + h);
    
  • forEach遍历

    map.forEach((k,v) -> {
    	System.out.println("键:" + key + ",值:" + value);
    })

高级用法:

  • merge
    merge 方法用于将指定的键和值合并到该映射中。如果指定键不存在,则会直接添加键值对,如果存在,则会使用提供的合并函数对已有的值进行修改。合并函数是一个函数式接口(对新值与旧值进行数据处理),接收两个参数:旧值和新值,并返回合并后的值。

    示例:

    Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.merge("A", 2, (oldValue, newValue) -> oldValue + newValue); // 结果为:3,A已经存在,返回1+2=3
    map.merge("B", 2, (oldValue, newValue) -> oldValue * newValue); // 结果为:2,B不存在,直接返回2
    
  • putIfAbsent
    putIfAbsent 方法用于将指定键值对添加到映射中,但仅在指定的键当前没有对应值时执行。如果键存在,则不做任何更改,并返回已存在的值;如果键不存在,则添加键值对,并返回 null。

    示例:

    Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.putIfAbsent("A", 2); // 结果为:1,因为A已存在
    map.putIfAbsent("B", 2); // 结果为:2,因为B已存在,map中新增B
    

在这里插入图片描述

特殊用法

WeakHashMap

WeakHashMap 是 Java 中的一个特殊类型的哈希映射。它与HashMap类似,但具有不同的垃圾回收行为。

它的键(key)是弱引用,这意味着当没有对键的强引用存在时,垃圾回收器会自动回收该键所占用的内存空间。而在普通的 HashMap 中,如果键仍然存在于映射中,即使没有对键的引用,垃圾回收器也不会回收其所占用的内存。

这使得 WeakHashMap 特别适合用于缓存和临时映射,因为它允许垃圾回收器根据内存需求自动清除不再需要的映射项。

示例:

import java.util.WeakHashMap;

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

        String key1 = new String("Key 1"); // 创建一个新的字符串对象作为键
        String key2 = new String("Key 2");

        map.put(key1, 10);
        map.put(key2, 20);

        System.out.println(map); // 输出: {Key 2=20, Key 1=10}

        key1 = null; // 解除对 key1 的强引用

        System.gc(); // 运行垃圾回收器

        System.out.println(map); // 输出: {Key 2=20}
    }
}

LinkedHashMap

LinkedHashMap 是 Java 中的一个特殊类型的哈希映射,它扩展了 HashMap 并提供了有序的插入顺序。

与普通的 HashMap 不同,LinkedHashMap 在内部使用一个双向链表来维护插入顺序。这意味着当遍历 LinkedHashMap 时,元素将按照插入的顺序进行迭代。而在普通的 HashMap中,元素的顺序是不确定的。

示例:

import java.util.LinkedHashMap;
import java.util.Map;

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

        map.put("Key 1", 10);
        map.put("Key 2", 20);
        map.put("Key 3", 30);

        // 遍历 LinkedHashMap 输出键和值
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

结果:

Key 1 -> 10
Key 2 -> 20
Key 3 -> 30

LinkedHashMap 还提供了构造函数,允许指定排序模式。排序模式可以是按照插入顺序(默认)、访问顺序或自定义的排序方式。

使用按照访问顺序排序的 LinkedHashMap:
当一个key被访问后,那么将会被移动最后一位。

import java.util.LinkedHashMap;
import java.util.Map;

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

        map.put("Key 1", 10);
        map.put("Key 2", 20);
        map.put("Key 3", 30);

        // 访问 Key 2,将其移到链表尾部
        map.get("Key 2");

        // 遍历 LinkedHashMap 输出键和值,按照访问顺序排序
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

结果:

Key 1 -> 10
Key 3 -> 30
Key 2 -> 20

通过设置 LinkedHashMap 的构造函数中的第三个参数为true,我们启用了按照访问顺序进行排序。当我们访问元素 "Key 2" 时,它被移到了链表的尾部,因此在遍历时它显示在最后。

EnumMap

EnumMap 是 Java 中的一种特殊的映射实现,它要求键是枚举类型。EnumMap 在内部使用数组来表示键值对,并且根据枚举常量的顺序进行了优化,因此具有较高的性能。

示例:

import java.util.EnumMap;
import java.util.Map;

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class EnumMapExample {
    public static void main(String[] args) {
        EnumMap<Day, String> schedule = new EnumMap<>(Day.class);

        schedule.put(Day.MONDAY, "MONDAY_VALUE");
        schedule.put(Day.TUESDAY, "TUESDAY_VALUE");
        schedule.put(Day.WEDNESDAY, "WEDNESDAY_VALUE");

        // 遍历 EnumMap 输出键和值
        for (Map.Entry<Day, String> entry : schedule.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

结果:
创建了一个 EnumMap 并向其添加了几个键值对。这里的键是枚举类型 Day,而值是字符串类型。然后我们通过遍历 EnumMap 来输出所有的键和值。

需要注意的是,由于 EnumMap 要求键是枚举类型,因此只能使用具有确定值集的枚举类作为键的类型。

MONDAY: "MONDAY_VALUE"
TUESDAY: "TUESDAY_VALUE"
WEDNESDAY: "WEDNESDAY_VALUE"

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zlog日志库的使用

代码仓库&#xff1a;https://github.com/HardySimpson/zlog1、zlog 库的默认安装位置是 /usr/local/lib&#xff0c;头文件的安装位置是 /usr/local/include&#xff1b;若需要更改安裝位置&#xff0c;可以修改src/makefile文件下第50行的PREFIX&#xff1f; /usr/local 改为…

当Dubbo遇到高并发:探究流量控制解决方案

系列文章目录 面试Dubbo &#xff0c;却问我和Springcloud有什么区别&#xff1f; 超简单&#xff0c;手把手教你搭建Dubbo工程&#xff08;内附源码&#xff09; 【收藏向】从用法到源码&#xff0c;一篇文章让你精通Dubbo的SPI机制 Dubbo最核心功能——服务暴露的配置、使用…

Doris注意事项,Doris部署在阿里云,写不进去数据

1.Doris官网 Doris官网https://doris.apache.org/ 2.根本原因 本地idea访问FE&#xff0c;FE会返回BE的地址&#xff0c;但是在服务器上通过ip addr查看&#xff0c;发现只有局域网IP&#xff0c;所以FE返回了局域网的IP&#xff0c;导致idea连接不上BE 3.解决办法 重写Ba…

leetcode刷题常用代码片段

Vscode是常用的开发工具&#xff0c;代码插入能够把常见的代码嵌入智能提醒&#xff0c;减轻了很大的工作量&#xff0c;下面是我刷题的配置&#xff0c;直接复制黏贴到自己的cpp.json里就可以用了 左下角&#xff0c;打开设置&#xff0c;选择用户代码片段&#xff0c;选择自…

智慧农业:科技赋能农村发展

智慧农业发展前景灿烂多彩&#xff0c;正为农业带来新的转型升级。随着科技的不断发展&#xff0c;数字化、自动化和智能化技术逐渐渗透进农业领域&#xff0c;为农民提供了更多高效便捷的农业管理方式。智慧农业通过物联网、大数据、人工智能等先进技术&#xff0c;实现对农田…

如何跳出Java中的多层嵌套循环?

在Java中&#xff0c;要跳出多层嵌套循环&#xff0c;可以使用带有标签的break语句。通过在外层循环前加上一个标签&#xff0c;然后在内层循环中使用break语句后跟标签名称&#xff0c;可以实现跳出多层循环的目的。 以下是使用标签和break语句跳出多层嵌套循环的示例代码&…

为 Google Play 即将推出基于区块链的内容政策做好准备

作者 / Joseph Mills, Group Product Manager, Google Play 作为一个平台&#xff0c;Google Play 一直致力于帮助开发者将创新理念变为现实。Google Play 上托管了许多和区块链相关的应用&#xff0c;我们深知合作伙伴们希望扩展这些应用&#xff0c;并利用 NFT 等代币化数字资…

学习笔记|大模型优质Prompt开发与应用课(二)|第五节:只需3步,优质Prompt秒变应用软件

原作者&#xff1a;依依│百度飞桨产品经理 一乔│飞桨开发者技术专家 分享内容 01:大模型应用简介 02:LLM应用开发范式 03: Al Studio大模型社区 04:AI对话类应用开发技巧 大模型技术爆发&#xff0c;各类应用产品涌现 文心产业级知识增强大模型 工作中的“超级助手”—…

基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

文章目录 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network摘要本文方法实验结果 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network 摘要 在…

Educational Codeforces Round 152 (Rated for Div. 2) B. Monsters

很早想到%K排序,但是就是WA2,心态崩了,昨天晚上差点睡不着觉吐了,感觉自己好笨啊啊啊, 言归正传, 按照正常的思路,样例是可以过的,但是AC不了,例如给出样例3 3 3 1 2 经过自己模拟应该输出1 3 2 ,但是只会输出1 2 3 ,知道症结所在debug,0的先输出,之后输出k-1,k-2…但是怎么实现…

接口自动化测试-Python自动发送测试报告邮件封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 SMTP&#xff08;…

vue新学习 02 vue命令v-model,数据代理,事件,监听,渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

亿万富翁Tim Draper:比特币将改变货币与商业的运作方式

点击视频可观看完整版 编译/编辑&#xff1a;秦晋 Draper Associates 创始人、亿万富翁Tim Draper最近接受FOX商业频道「克拉曼倒计时」采访时表示&#xff0c;尽管最近有所下跌&#xff0c;但比特币一直在不断增强持久力&#xff0c;他表示该资产与其他加密货币有所不同。 在T…

okhttp原理分析

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 01okhttp module里 包含的设计模式&#xff1a;建造者设计模式、责任链设计模式CustomInject 演示自定义注解 代码&#xff1a;okhttp原理分析、Androi…

GoLand IDE 2023 快捷键大全:提高开发效率的必备操作

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

汉诺塔与二进制、满二叉树的千丝万缕

汉诺塔(Tower of Hanoi)源于印度传说中&#xff0c;大梵天创造世界时造了三根金钢石柱子&#xff0c;其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;在小圆盘上不能放大圆盘&#xff0c;在三…

PostgreSQL PG16 逻辑复制在STANDBY 上工作 (译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

【Ubuntu18.04免密码登录SSH】

Ubuntu18.04免密码登录SSH 1 查看Ubuntu18.04系统中是否存在SSH服务2 配置SSH2.1 先删除一下ssh的目录&#xff0c;重新配置2.2 生存公钥和私钥2.3 将公钥上传到需要登录的服务器2.4 测试登录 1 查看Ubuntu18.04系统中是否存在SSH服务 sudo ps -e |grep ssh没有的话&#xff0…

【Vue3+Ts+Vite】配置滚动条样式

一、先看效果 二、直接上代码 <template><div class"main-container"><h1 v-for"index in 50" :key"index">这是home页面</h1></div> </template> <style lang"scss" scoped> .main-conta…

Stephen Wolfram:类似人类任务的模型

Models for Human-Like Tasks 类似人类任务的模型 The example we gave above involves making a model for numerical data that essentially comes from simple physics—where we’ve known for several centuries that “simple mathematics applies”. But for ChatGPT w…