java Map集合

2023-11-19

一、介绍

Java中的Map是一种键值对的集合数据类型,用于存储无序的、不重复的键值对。它提供了快速的查找和访问功能,可以根据键来获取值。

常见的Map实现类有:HashMap、TreeMap、LinkedHashMap等。

二、HashMap

HashMap是Java中的一种键值对集合,它允许存储不重复的键和对应的值,使用哈希表(数组+链表/红黑树)实现。HashMap中的键和值都可以为null。
下面是HashMap的一些常用方法:

  • put(K key, V value):添加键值对。
  • get(Object key):根据键获取值。
  • remove(Object key):删除指定键的键值对。
  • containsKey(Object key):判断是否包含指定的键。
  • containsValue(Object value):判断是否包含指定的值。
  • size():返回集合中键值对的个数。
  • clear():清空集合中所有的键值对。

使用示例:


public class Demo1_Map {
    /*
    * hashset底层依赖hashmap
    * hashmap是双列集合
    * 添加功能:map.put("张三",23)
    * 删除功能:map.remove("张三");返回对应的值
    * 是否包含:map.containsKey("李四"),map.containsValue(24)
    * 返回所有值:map.values();
    * 集合大小:map.size()
    * */
    public static void main(String[] args){
        test2();
    }
    public static void test1(){
        Map<String,Integer> map = new HashMap<>();
        map.put("张三",23);//相同的键不存储,值覆盖
        map.put("李四",24);
//        map.remove("张三");
        Collection<Integer> c = map.values();
        System.out.println(c);
        System.out.println(map);
        System.out.println(map.containsKey("李四"));
        System.out.println(map.containsValue(24));
        //获取所有的键,遍历map集合
        Set<String> keySet = map.keySet();//拿到所有的键
        for (String s:keySet) {
            Integer i= map.get(s);
            System.out.println(i);
        }
    }
    //map集合第二种迭代,根据键值对对象,获取键和值
    public static void test2(){
        Map<String,Integer> map = new HashMap<>();
        map.put("张三",23);//相同的键不存储,值覆盖
        map.put("李四",24);
        //map.entry说明entry是map的内部接口,将键和值封装成对象,并存储在set集合中
//        Set<Map.Entry<String,Integer>> entryset = map.entrySet();
//        //获取每一个对象
//        Iterator<Map.Entry<String,Integer>> it = entryset.iterator();
//        while (it.hasNext()){
//            //获取每一个entry对象
//            Map.Entry<String,Integer> en = it.next();
//            System.out.println(en.getKey()+en.getValue());
//        }
        for (Map.Entry<String,Integer> en:map.entrySet()) {
            System.out.println(en.getKey()+en.getValue());
        }

    }
}

三、TreeMap

TreeMap是Java中的一种有序键值对集合,它基于红黑树实现,可以保证元素按照键的顺序进行排序。TreeMap允许null值但不允许null键。

下面是TreeMap的一些常用方法:

  • put(K key, V value):添加键值对。
  • get(Object key):根据键获取值。
  • remove(Object key):删除指定键的键值对。
  • containsKey(Object key):判断是否包含指定的键。
  • containsValue(Object value):判断是否包含指定的值。
  • size():返回集合中键值对的个数。
  • clear():清空集合中所有的键值对。
  • firstKey():返回第一个键。
  • lastKey():返回最后一个键。
  • subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive):返回部分子Map。

使用示例:

TreeMap<String, Integer> map = new TreeMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
int value = map.get("apple");
System.out.println(value); // 输出1
map.remove("orange");
if (map.containsKey("banana")) {
    System.out.println("Map中包含键为'banana'的元素");
}
String firstKey = map.firstKey();
String lastKey = map.lastKey();
System.out.println("第一个键:" + firstKey + ",最后一个键:" + lastKey);

// 返回子Map
SortedMap<String, Integer> subMap = map.subMap("apple", true, "banana", false);
System.out.println(subMap); // 输出{"apple"=1}

存储自定义对象需要重写comparator接口

//treemap存储自定义对象student和string案例,需要重写comparator接口
public class Demo4_TreeMap {
    public static void main(String[] args){
        TreeMap<Student,String> tm = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int n = o1.getAge() - o2.getAge();
                return n==0?o1.getName().compareTo(o2.getName()):n;
            }
        });
        tm.put(new Student("张三啊",23),"北京");
        tm.put(new Student("张三啊",23),"上海");
        tm.put(new Student("李四",24),"广州");
        tm.put(new Student("王五",25),"深圳");
        System.out.println(tm);
    }
}

需要注意的是,TreeMap是有序的,但它并不是线程安全的。如果多个线程同时修改同一个TreeMap实例,可能会导致数据不一致或者抛出ConcurrentModificationException异常。如果需要在多线程环境中使用TreeMap,可以考虑使用ConcurrentSkipListMap等线程安全的实现类。

四、LinkedHashMap

LinkedHashMap是HashMap的一个子类,它可以维护插入元素时的顺序,也可以通过访问顺序来迭代。
可以通过以下两种方式来创建LinkedHashMap。

Map<String, String> linkedHashMap1 = new LinkedHashMap<>();
Map<String, String> linkedHashMap2 = new LinkedHashMap<>(16, 0.75f, true);

第一个方式创建LinkedHashMap时,它的顺序是不确定的。第二个方式创建LinkedHashMap时,它可以按照访问顺序来迭代。其中16是初始化容量,0.75f是负载因子,true表示采用访问顺序。如果不需要按照访问顺序来迭代,则可以将最后一个参数设置为false。

简单使用:

public class Demo3_linkedHashMap {
    public static void main(String[] args){
        LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
        lhm.put("张三",23);
        lhm.put("李四",24);
        lhm.put("王五",25);
        System.out.println(lhm);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java Map集合 的相关文章

随机推荐

  • Jmeter 数据库压力测试

    一 jmeter本地数据库压力测试 1 将JMeterPlugins Extras jar和JMeterPlugins Standard jar放到apache jmeter 3 0 lib ext目录下 2 在本地打开ServerAgen
  • 操作系统学习(九)进程通信

    一 知识总览 二 定义 进程通信是指进程之间的信息交换 每个进程都拥有自己的内存空间 是相互独立的 这样在每个进程执行时 才不会被其他进程所干扰 三 进程通信的方式 1 共享存储 1 两个进程对共享区的访问必须是互斥的 即在同一时间内 只允
  • C语言实现kafka多线程,【转】c++(11)使用librdkafka库实现kafka的消费实例

    版权声明 本文为博主原创文章 遵循 CC 4 0 by sa 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net lijinqi1987 article details 76691170 librdk
  • AspectJ使用

    一 AOP介绍 AOP Aspect Oriented Programming 面向切面编程 是一种新的方法论 编程范式 是对传统 OOP Object Oriented Programming 面向对象编程 的补充 旨在通过允许横切关注点
  • 2022 React 面试题(50道)

    什么是同源 如果两个页面 接口 的协议 域名 端口号都相同 我们认为他们具6511有相同的源 UmiJs和dva roadhog是什么关系 roadhog 是基于 webpack 的封装工具 目的是简化 webpack 的配置 umi 可以
  • 初学Linux基本的命令操作应当记牢

    Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除
  • 7.Closing non transactional SqlSession 导致事务失败问题

    博主在研究Spring事务源码 编写测试代码时 出现了Closing non transactional SqlSession 导致事务失败的问题 于是写下这篇文章 记录一下这个问题 前提 已经通过配置方式 开启了 Spring 声明式事务
  • JS练习_九九乘法表

    效果图 分析 1 先使用基本的for循环嵌套 展示乘法表 2 完
  • Qt使用https

    Qt貌似默认是不支持SSl认证的 可以这样操作 将 libeay32 dll和ssleay32 dll这两个库文件拷贝到程序生成目录下 即生成exe的同级目录 或者拷贝到QtNetwork模块的库文件目录中 路径示例 E Qt Qt5 12
  • qt orm 基于Qt的ORM框架QyOrm,类似peewee,最简单的语法,最高效的使用

    QyOrm Gitee传送门 支持功能 AutoGenerate根据数据库表自动生成类的定义代码 外键 实例化 联合查询 特殊查询 Json的读取和保存 QT GUI常见input widget 的双向绑定 以下是使用的例子 手动 类的定义
  • 第一篇:PyGame小游戏——2D迷宫游戏(16W字详解)

    目录 在开头的开场白 在CSDN看到一篇 利用深度优先算法自动生成随机迷宫 的blog 突发灵感 就想做这个迷宫游戏 本文大部分讲的意思 而非代码 文章最后会展示最终代码和图片的 读者不用过多地注意那些 本文是作者第一次写blog 难免有些
  • 【Java编程】关于Java的几个基础问题

    关于Java的几个基础问题 String 和 StringBuffer 和 StringBuilder 的异同 相同点 三者在 Java 中都是用来处理字符串的 三个类都被 final 修饰 因此都是不可继承的 StringBuilder
  • 超级等级福利礼包

    文章目录 一 介绍 二 设计等级礼包的目的 1 提升游戏玩家活跃度 2 提升游戏用户吸引力 3 提高游戏用户留存率 4 实现间接收入 5 持续营收 三 玩家心理总结 四 总结该模式的赢利点 五 该模式的应用场景举例 一 介绍 超级等级福利礼
  • 二分查找(C语言版)

    刚刚学到到的知识 掌握的不怎么好 如有不足麻烦留言 第一步 先理清你要查找的数组 最好是有序排序的数组 本人还没学到数组的排序就只能用有序的数组来 int arr 10 1 2 3 4 5 6 7 8 9 10 第二步 计算出该数组的长度
  • MATLAB(1)MATLAB工作环境

    目录 工具栏 当前文件夹窗口 命令行窗口 工作区 文件编辑窗口 图形 Figure x 窗口 本文基于MATLAB R2020b MATLAB刚打开时 一般如下图所示 包括上方的工具栏 左侧的当前文件夹窗口 中间的命令行窗口以及最右侧的工作
  • 考研机试题 -- 字符串、背包、枚举

    目录 首字母大写 字符串 日志排序 字符串 双关键字排序 字符串转换整数 字符串 点菜问题 01背包 神奇的口袋 01背包 计数 整数拆分 完全背包 计数 CCF201512 2 消除类游戏 枚举 首字母大写 字符串 https www n
  • 全球排名第一的免费开源ERP Odoo替代料管理应用解决方案

    本文节选自Odoo亚太金牌服务机构 开源智造 所编写的 ERP真的免费不花钱 Odoo应用指南 如需获取完整的知识内容 请至开源智造官网免费获取 感谢网友一键三连 点赞 转发 收藏 您的支持是我们最大的前进动力 电子行业产品竞争激烈 升级换
  • 【QT学习】实现MVC框架的简易封装(一文读懂)

    文章目录 前言 一 MVC框架简介 1 核心部件 2 使用目的 3 MVC优点 二 具体封装步骤 1 文件管理 2 创建模型 3 创建控制器 4 MVC实现 用户登录验证为例 总结 前言 MVC Model View Controller
  • Spring Boot中的JSON技术

    Spring Boot中的JSON技术 SpringBoot在处理对象的序列化和反序列的时候 底层用的是Jackson 来完成数据到实体类 实体类集合的映射 我们开发会指定 RequestBody ResponseBody 这样的注解 而了
  • java Map集合

    目录 一 介绍 二 HashMap 三 TreeMap 四 LinkedHashMap 一 介绍 Java中的Map是一种键值对的集合数据类型 用于存储无序的 不重复的键值对 它提供了快速的查找和访问功能 可以根据键来获取值 常见的Map实