集合框架之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(慎用)

相关文章
|
5天前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
9 1
|
10天前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
|
5天前
|
存储 消息中间件 算法
Java中的集合框架详解:List、Set、Map的使用场景
Java中的集合框架详解:List、Set、Map的使用场景
|
6天前
|
缓存 Java 测试技术
探讨Java中遍历Map集合的最快方式
探讨Java中遍历Map集合的最快方式
8 1
|
2天前
|
前端开发
Request获取Map集合,提取username后面的值方法,post和get提取集合的方法
Request获取Map集合,提取username后面的值方法,post和get提取集合的方法
|
3天前
|
存储 API Kotlin
Kotlin中的Map集合
Kotlin中的Map集合
5 0
|
10天前
|
Java
Java集合之map 集合使用
Java集合之map 集合使用
6 0
|
1月前
Map集合的简述
Map集合的简述
|
20天前
|
存储 缓存 Java
Java遍历Map集合的方法
在Java中,遍历Map集合主要有四种方式:1) 使用`keySet()`遍历keys并用`get()`获取values;2) 使用`entrySet()`直接遍历键值对,效率较高;3) 通过`Iterator`遍历,适合在遍历中删除元素;4) Java 8及以上版本可用`forEach`和Lambda表达式,简洁易读。`entrySet()`通常性能最佳,而遍历方式的选择应考虑代码可读性和数据量。
29 0
|
19天前
|
存储 安全 Java
Java集合详解:Set, Map, Vector, List的对比与联系
Java集合框架核心包括List、Set、Map和Vector。List允许重复元素,如ArrayList(适合读取)和LinkedList(适合插入删除)。Set不允许重复,有HashSet(无序)和TreeSet(排序)。Map存储键值对,HashMap(无序)和TreeMap(排序)。Vector是线程安全的ArrayList替代品,但在多线程环境下使用。选择集合类型应根据应用场景,如有序、无序、键值对需求及线程安全考虑。