详解Java集合类之Map篇

 更新时间:2022年07月26日 16:59:44   作者:世界尽头与你  
这篇文章主要为大家详细介绍一下Java集合类中Map的用法,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下

1.Map接口介绍

Map用于保存具有映射关系的数据:Key - Value

对于Set,底层其实依然是一个Map,但是Set选择不使用Value,也就是Set的Value值始终是一个常量

Map中的Key和Value可以是任何类型的数据,会封装到HashMap$Node对象中

Map中的Key不能重复,但是Value可以重复,当有相同的Key时,等价与替换操作

2.Map接口分析

存放Map键值对是在HashMap$Node中

tab[i] = newNode(hash, key, value, null);

--

Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) {
    return new Node<>(hash, key, value, next);
}

那么这个Node节点的数据类型是什么样的呢?

我们来看一下源代码:(其还实现了Entry接口)

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;  // 存放hash值
    final K key;  // 存放key值
    V value;  // 存放Value值
    Node<K,V> next;  // 存放下一个个节点,以形成链表结构
}

k-v为了方便程序员的遍历,还会创建一个EntrySet集合,该集合存放的元素类型是Entry,而一个Entry对象含有k,v,但是本质上这里的k-v值还是指向一个Node节点中的数据,也就是这里的k-v存放的依然是地址数据

// k-v存在有EntrySet的一个指向
Set set = map.entrySet();
System.out.println(set.getClass());

输出:

class java.util.HashMap$EntrySet

那么,这个方便程序员遍历的特性是如何体现的呢?

原因是Map.Entry提供了两个非常重要的方法:K getKey(); V getValue();。所以我们可以通过如下的方式进行遍历Map:

Set set = map.entrySet();
System.out.println(set.getClass());
for (Object obj : set) {
    Map.Entry entry = (Map.Entry) obj;
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}

那怎么证明Entry里面存放的k-v只是地址的指向呢?很简单

通过debug,我们先来看一下Map中存放的数据,其no2这个键的地址是@727

再来看一下set中no2键的地址,一模一样:

3.Map接口方法

代码示例:

Map map = new HashMap();
// 添加键值对
map.put("no1","dahe");
map.put("no2","zhangsan");
// Key重复会进行替换
map.put("no1","lisi");
System.out.println(map);

// 根据键删除映射关系
map.remove("no1");
System.out.println(map);
// 根据key得到值
Object no2 = map.get("no2");
System.out.println(no2);
// 获取键值对数量
System.out.println(map.size());
// 判空
System.out.println(map.isEmpty());
// 清空
// map.clear();
// 查找键是否存在
System.out.println(map.containsKey("ok"));

4.Map遍历方式

第一式:取出所有的key,通过key取出对应的value

// 取出所有的key,通过key取出对应的value
Set keySet = map.keySet();
for (Object o : keySet) {
    System.out.println(o);
    System.out.println(map.get(o));
}

第二式:把所有的value值取出

// 把所有的value值取出
Collection values = map.values();
for (Object value : values) {
    System.out.println(value);
}

第三式:通过EntrySet来获取 k-v

// 通过EntrySet来获取 k-v
Set entrySet1 = map.entrySet();
for (Object o : entrySet1) {
    // 将entry 转成 Map.Entry
    Map.Entry m = (Map.Entry) o;
    System.out.println(m.getKey());
    System.out.println(m.getValue());
}

到此这篇关于详解Java集合类之Map篇的文章就介绍到这了,更多相关Java集合类Map内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring如何处理表单提交

    Spring如何处理表单提交

    这篇文章主要介绍了Spring如何处理表单提交,帮助大家更好的理解和学习spring框架,感兴趣的朋友可以了解下
    2020-10-10
  • spring jpa 审计功能自定义填充字段方式

    spring jpa 审计功能自定义填充字段方式

    这篇文章主要介绍了spring jpa审计功能自定义填充字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 字符串desede 3des加密示例分享

    字符串desede 3des加密示例分享

    这篇文章主要介绍了字符串desede 3des加密示例,大家参考使用吧
    2014-01-01
  • Java两种动态代理JDK动态代理和CGLIB动态代理详解

    Java两种动态代理JDK动态代理和CGLIB动态代理详解

    这篇文章主要介绍了Java两种动态代理JDK动态代理和CGLIB动态代理详解,代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式,为了对外开放协议,B往往实现了一个接口,A也会去实现接口,需要的朋友可以参考下
    2023-11-11
  • 5分钟教你使用java搞定网站登录验证码

    5分钟教你使用java搞定网站登录验证码

    这篇文章主要为大家介绍了使用java搞定网站登录验证码的快速实现方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • java使用DOM4J对XML文件进行增删改查操作

    java使用DOM4J对XML文件进行增删改查操作

    这篇文章主要为大家详细介绍了java使用DOM4J对XML文件进行增删改查操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    这篇文章主要介绍了SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot使用JTA实现对多数据源的事务管理

    SpringBoot使用JTA实现对多数据源的事务管理

    了解事务的都知道,在我们日常开发中单单靠事务管理就可以解决绝大多数问题了,但是为啥还要提出JTA这个玩意呢,到底JTA是什么呢?他又是具体来解决啥问题的呢?本文小编就给大家介绍一下如何在Spring Boot中使用JTA实现对多数据源的事务管理
    2023-11-11
  • Java继承Thread类创建线程类示例

    Java继承Thread类创建线程类示例

    这篇文章主要介绍了Java继承Thread类创建线程类,结合实例形式分析了java线程操作相关使用技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • Java 常见排序算法代码分享

    Java 常见排序算法代码分享

    这篇文章主要介绍了Java 常见排序算法代码分享,文章通过分享详细的代码总结文章内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-03-03

最新评论