这篇文章主要为大家详细介绍一下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内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:详解Java集合类之Map篇
基础教程推荐
- Java文件管理操作的知识点整理 2023-05-19
- Java并发编程进阶之线程控制篇 2023-03-07
- springboot自定义starter方法及注解实例 2023-03-31
- Java实现线程插队的示例代码 2022-09-03
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现查找文件和替换文件内容 2023-04-06
- Java数据结构之对象比较详解 2023-03-07
- java实现多人聊天系统 2023-05-19
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java基础知识之FileInputStream流的使用 2023-08-11