集合框架之Map集合(上)

简介: 集合框架之Map集合

一、前言

1.为什么使用Map集合

1.1.快速查找

如果需要根据一个唯一的标识(如ID)来快速查找对应的数据记录,可以将这些数据记录按照ID作为键存储到Map中,这样就可以通过ID快速查找到对应的数据记录。

1.2.数据去重

如果需要对一批数据进行去重操作,可以使用Map来去重。将数据作为Map的键存储到Map中,由于Map中每个键只能对应一个值,如果将重复的数据作为键存储到Map中,则只会存在一份数据记录,实现了去重任务。

1.3.统计频次

如果需要统计一些数据的频次,可以使用Map来实现。将需要统计的数据作为Map的键存储到Map中,每次出现一次数据就将Map中对应的值加1,这样就可以快速得到每个数据出现的频次。

1.4.内存中保存数据

如果需要将一些数据保存在内存中,可以使用Map将这些数据存储起来。由于Map底层实现是哈希表,查找效率较高,所以在实现中,我们可以使用Map来保存相应的数据。

2.使用场景

综上所属,如何统计字符串中的字符出现次数?

我们可以利用toCharArray方法先将字符串转换为字符数组,然后遍历该数组,判断该字符是否存在map集合中,如果存在value加1,反之就追加到map集合内并设默认值1。(map集合建议使用泛型键-字符/值-出现次数

        // 定义一个变量保存字符串
    String str = "fhyuaefcahwhchansgowavfawxwxwjwgliq";
    // 转换为char类型
    char[] charArray = str.toCharArray();
    // 定义一个map集合保存单字符和出现次数
    Map<Character, Integer> map = new HashMap<>();
    // 遍历char数组
    for (char c : charArray) {
      // 通过键拿到值,如果值为空说明不存在,添加到map集合中
      // 如果存在拿到当前键的值数量加一
      Integer integer = map.get(c);
      if (integer != null) {
        map.put(c, integer + 1);
      } else {
        map.put(c, 1);
      }
    }
    // 利用entryset输出结果
    Set<Entry<Character, Integer>> entrySet = map.entrySet();
    System.out.println("--------------旧集合----没有排序---------------------");
    for (Entry<Character, Integer> entry : entrySet) {
      System.out.println(entry.getKey() + "出现了" + entry.getValue() + "次");
    }

有兴趣的小伙伴可以自己数数看哦!!

进阶版---按照出现次数排序,如果出现次数一致按照字母升序

        // 利用Treemap排序
    TreeMap<Character, Integer> treemap = new TreeMap<>(new Comparator<Character>() {
      @Override
      public int compare(Character o1, Character o2) {
        if(map.get(o2) - map.get(o1)==0) {
          return o1 -o2;
        }
        return map.get(o2) - map.get(o1);
      }
    });
    // fore遍历旧集合
    Set keySet = map.keySet();
    for (Object object : keySet) {
      // 添加到新集合
      treemap.put((Character) object, map.get(object));
    }
    Set<Character> keySet2 = treemap.keySet();
    System.out.println("----新集合----按照次数降序,如果次数一致按照字母升序--------);
    for (Character character : keySet2) {
      System.out.println(character + "出现了" +  treemap.get(character)+ "次");
    }

😎是不是很简单呢?和我一起学IT让你的代码变得有趣!!

二、Map集合特点

1.数据结构

增删查

        Map map = new HashMap<>();
    // 新增
    map.put("name", "xw");
    map.put("age", 18);
    map.put("name2", "wh");
    map.put("age2", 18);
    // 查看
    System.out.println(map);// {name=xw, name2=wh, age=18, age2=18}
    // 删除
    map.remove("name2");
    System.out.println(map);// {name=xw, age=18, age2=18}

注意:Map集合没有修改方法,因为它没有下标,但是它的键是唯一的可以通过覆盖的方式达到修改的效果。

特点:键值对形式存储;键可以为空。

2.遍历方式

因为Map没有下标,也没有继承Collection接口,所以它的遍历方式只有三种。

使用fore遍历

            Map map = new HashMap<>();
    map.put("name", "xw");
    map.put("age", 18);
    map.put("name2", "wh");
    map.put("age2", 18);
        // 先获取键key
    Set keySet = map.keySet();
    for (Object object : keySet) {
      // 根据键得到值
      System.out.println("键:" + object + "--值:" + map.get(object));
        // 打印结果为:
        //键:name--值:xw
        //键:name2--值:wh
        //键:age--值:18
        //键:age2--值:18
  }

使用entryset遍历

        Set entrySet = map.entrySet();
    for (Object object : entrySet) {
      // 因为这个map集合没有用泛型,所以需要强制转换
      Map.Entry maps = (Entry) object;
      // 调用maps.getKey()获取键 / 调用maps.getValue()获取值
      System.out.println("键=" + maps.getKey() + "  值=" + maps.getValue());
    }
        //打印结果为
        //键=name  值=xw
        //键=name2  值=wh
        //键=age  值=18
        //键=age2  值=18

使用values()方法遍历

         //values遍历
    for (Object object : map.values()) {
      System.out.println(object);
    }
        //打印结果
        //xw
        //wh
        //18
        //18

注意:这种方式拿不到键,只能拿到value(慎用)

相关文章
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
26天前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
33 0
|
3月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
3月前
|
安全 Java
【Java集合类面试五】、 如何得到一个线程安全的Map?
如何得到一个线程安全的Map的方法包括:使用Collections工具类将Map包装为线程安全,使用java.util.concurrent包下的ConcurrentHashMap,以及不推荐使用性能较差的Hashtable。
|
5月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
5月前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
74 3
|
3月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
3月前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
3月前
|
存储