Java那点儿事之Map集合不为人知的秘密有哪些

 更新时间:2021年10月21日 14:21:39   作者:空山新雨后~  
Map用于保存具有映射关系的数据,Map集合里保存着两组值,一组用于保存Map的key,另一组保存着Map的value,和查字典类似,通过key找到对应的value,通过页数找到对应的信息。用学生类来说,key相当于学号,value对应name,age,sex等信息。用这种对应关系方便查找

前言

上期我们说到了Collection集合,他是单列的集合,分为List集合和Set集合,今天我将继续分析一个双列集合也就是Map,为什么叫他双列集合呢? 往下看,你就知道了。

一、Map

Map集合的特点
- 键值对映射关系
- 一个键对应一个值
- 键不能重复,值可以重复
- 元素存取无序

我们通过他的一个实现类HashMap集合来理解

二、HashMap的基本概念

HashMap的定义:

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

那么HashMap的键和值的类型可以是String类型,也可以是其他数据的包装类类型,那么说到包装类类型,这里顺便帮大家复习一下包装类类型哦:

三、HashMap集合的基本方法与使用

学完HashMap集合的基本概念,那么我们怎么去在实际开发过程中去使用他呢?这里我们就要用到他的特有方法了,

以下是HashMap集合的常用方法

需要注意的是,Map集合的元素的添加并不是Collection集合的add()方法,而是Put()方法。因为Map集合是键值对集合,那么我们如何获取集合中的每一个元素呢?这里集合也给我们提供了他的元素获取方法:

示例代码如下:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
/*
    Map集合的获取功能:
        V get(Object key):根据键获取值
        Set<K> keySet():获取所有键的集合
        Collection<V> values():获取所有值的集合
 */
public class MapDemo03 {
    public static void main(String[] args) {
        Map<String, String> m = new HashMap<String, String>();
 
        m.put("张三", "李四");
        m.put("王五", "赵六");
        m.put("李老板", "光头强");
        // V get(Object key):根据键获取值
        System.out.println(m.get("张三"));
 
        System.out.println(m.get("张四"));
        System.out.println("=============");
 
        //        Set<K> keySet():获取所有键的集合
        Set<String> s = m.keySet();
        for (String i : s) {
            System.out.println(i);
        }
        System.out.println("=============");
 
        //        Collection<V> values():获取所有值的集合
        Collection<String> c = m.values();
        for (String x : c) {
            System.out.println(x);
        }
    }
}

输出结果:

李四
null
=============
张三
王五
李老板
=============
李四
赵六
光头强

四、HashMap集合的遍历

其实遍历无非就是把集合中的元素一个一个给取出来,我们能用,那么在第三部分其实就已经讲到了一种遍历方式,那就是我们去获取键的集合,然后用循环去获取每一个键所对应的值,这样我们就将集合中的每一个元素取出来了。

遍历方式一:根据键的集合找值

步骤分析
- 获取所有键的集合。用keySet()方法实现
- 遍历键的集合,获取到每一个键。用增强for实现
- 根据键去找值。用get(Object key)方法实现

代码实现

import java.util.Map;
import java.util.HashMap;
import java.util.Set;
 
/*
    Map集合的遍历(方式1):
        1:获取所有键的集合。用keySet()方法实现
        2:遍历键的集合,获取到每一个键。用增强for实现
        3:根据键去找值。用get(Object key)方法实现
 */
public class MapDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();
 
        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");
        //1:获取所有键的集合。用keySet()方法实现
        Set<String> keySet = map.keySet();
 
        for (String key : keySet) {
            String value = map.get(key);
            System.out.println(key + "," + value);
        }
 
    }
}

输出结果:

杨过,小龙女
郭靖,黄蓉
张无忌,赵敏

那么第二种方法就是我们利用entrySet()方法来获取集合中所有的键值对集合,然后去获取所对的键或值。

HashMap集合遍历方式二:键值对集合找键值对

步骤分析
- 获取所有键值对对象的集合
- Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
- 遍历键值对对象的集合,得到每一个键值对对象
- 用增强for实现,得到每一个Map.Entry
- 根据键值对对象获取键和值
- 用getKey()得到键
- 用getValue()得到值

代码实现

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
/*
    Map集合的遍历(方式2):
        1:获取所有键值对对象的集合
            Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
        2:遍历键值对对象的集合,得到每一个键值对对象
            用增强for实现,得到每一个Map.Entry
        3:根据键值对对象获取键和值
            用getKey()得到键
            用getValue()得到值
 */
public class MapDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();
 
        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");
 
        //1:获取所有键值对对象的集合
        Set<Map.Entry<String, String>> me = map.entrySet();
 
//        遍历键值对对象的集合,得到每一个键值对对象
        for (Map.Entry<String, String> e : me) {
            String key = e.getKey();
            String value = e.getValue();
            System.out.println(key + "," + value);
        }
 
    }
}

输出结果:

杨过,小龙女
郭靖,黄蓉
张无忌,赵敏

两种遍历方式都是很实用,各位大佬在开发中愿意用哪种都是可以的哦。

五、HashMap集合的综合案例

有道是:与其临渊羡鱼,不如退而结网。看了那么 多理论的东西不自己动手去实践一下,那么鱼儿永远在鱼塘,知识永远在电脑里,接下来就让我们一起动手做一道题,来加深一下印象。

案例需求:

案例需求
- 键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。
- 举例:键盘录入“aababcabcdabcde” 在控制台输出:“a(5)b(4)c(3)d(2)e(1)”

思路解析:

1:键盘录入一个字符串
2:创建HashMap集合,键是Character,值是Integer
3:遍历字符串,得到每一个字符
4:拿得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储
如果返回值不是null:说明该字符在HashMap集合中存在,把该值加1,然后重新存储该字符和对应的值
5:遍历HashMap集合,得到键和值,按照要求进行拼接
6:输出结果

代码实例:

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
 
/*
    需求:
        键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。
        举例:键盘录入“aababcabcdabcde”	在控制台输出:“a(5)b(4)c(3)d(2)e(1)”
    思路:
        1:键盘录入一个字符串
        2:创建HashMap集合,键是Character,值是Integer
        3:遍历字符串,得到每一个字符
        4:拿得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
            如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储
            如果返回值不是null:说明该字符在HashMap集合中存在,把该值加1,然后重新存储该字符和对应的值
        5:遍历HashMap集合,得到键和值,按照要求进行拼接
        6:输出结果
 */
public class HashMapDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();
 
        HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
 
        for (int i = 0; i < s.length(); i++) {
            char key = s.charAt(i);
 
            Integer value = hm.get(key);
            if (value == null) {
                hm.put(key, 1);
 
            } else {
                value++;
                hm.put(key, value);
            }
        }
 
        StringBuilder sb = new StringBuilder();
 
        Set<Character> keySet = hm.keySet();
        for (Character key1 : keySet) {
            Integer values = hm.get(key1);
            sb.append(key1).append("(").append(values).append(")");
        }
        String result = sb.toString();
        System.out.println(result);
    }
}

输出结果:

请输入一个字符串:
aababcabcdabcde
a(5)b(4)c(3)d(2)e(1)

六、总结

学习集合就应该仔细去了解其特有方法,并注意区分,多实践才能加深明白其中用法,并且应该结合以前学习的知识去理解,可能会有意向不到的收获哦。本期分享到这里结束了,结合上期食用更佳哦,下期再见!

到此这篇关于Java那点儿事之Map集合不为人知的秘密有哪些的文章就介绍到这了,更多相关Java Map集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java反射机制的学习总结

    Java反射机制的学习总结

    总的来说,java反射机制是一个很好用的东西,用它可以解决很多死的东西,因为反射机制的灵活行很大,有了他,我们就不要花太多的时间来写操做数据库的代码了,而是方法更多的时间在项目的逻辑功能上,这个可以很大的减少开发时间,而且代码的可读性好
    2013-09-09
  • java实现简单银行管理系统

    java实现简单银行管理系统

    这篇文章主要为大家详细介绍了java实现简单银行管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java IO流和文件操作实现过程解析

    Java IO流和文件操作实现过程解析

    这篇文章主要介绍了Java IO流和文件操作实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 使用redisTemplate的scan方式删除批量key问题

    使用redisTemplate的scan方式删除批量key问题

    这篇文章主要介绍了使用redisTemplate的scan方式删除批量key问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringBoot指标监控功能实现

    SpringBoot指标监控功能实现

    这篇文章主要介绍了SpringBoot指标监控功能实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • idea的spring boot项目实现更改端口号操作

    idea的spring boot项目实现更改端口号操作

    这篇文章主要介绍了idea的spring boot项目实现更改端口号操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • mybatis之调用带输出参数的存储过程(Oracle)

    mybatis之调用带输出参数的存储过程(Oracle)

    这篇文章主要介绍了mybatis调用带输出参数的存储过程(Oracle),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 手写redis@Cacheable注解 支持过期时间设置方式

    手写redis@Cacheable注解 支持过期时间设置方式

    这篇文章主要介绍了手写redis@Cacheable注解 支持过期时间设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java显示当前的系统时间

    java显示当前的系统时间

    这篇文章主要介绍了java如何显示当前的系统时间,代码很简单,自己可以自定义显示的系统时间的颜色和字体,需要的朋友可以参考下
    2015-10-10
  • Java中的ZooKeeper使用

    Java中的ZooKeeper使用

    本文主要介绍了Java中的ZooKeeper使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08

最新评论