Java中的映射Map - 入门篇
前言
大家好啊,我是汤圆,今天给大家带来的是《Java中的映射Map - 入门篇》,希望对大家有帮助,谢谢
简介
前面介绍了集合List,这里开始简单介绍下映射Map
,相关类如下图所示
正文
Map是一种存储键值对的数据集合,键以散列或者树形结构进行存储;
为什么会设计Map接口呢?
假设我们有一个员工类,里面有Id属性和姓名等其他信息,现在我们把所有员工都存到List里,然后要找出Id为001的员工,你会发现,你需要从List中遍历每个对象,然后取出Id进行比较;
你会发现这种查找法效率很低,有点杀鸡用牛刀的感觉;
这时如果有一个集合类,可以以键值对映射的方式的存储员工信息(Id作为键,员工信息作为值),那么就可以只遍历键列表,然后进行比较;
你会发现这种查找法效率提高了很多,因为物尽其用了(比较的是Id,也只是取了Id,没有浪费);
这就是Map接口的作用,可以根据某个键去查找对应的信息,有点类似于数据库的设计。
Map的种类
Map主要有三种类型:HashMap(常用)、TreeMap(树形结构)、LinkedHashMap(前两者的结合)
我们先来看一下Map接口主要的几个方法:
V put(K key, V value)
:往Map中添加键值对,其中key为键,value为值;如果key存在,则覆盖原有的值;如果不存在,则新建键值对。V get(Object key)
:从Map中查找键key对应的值,如果没有,则返回nulldefault V getOrDefault(Object key, V defaultValue)
:从Map中查找键key对应的值,如果没有,则返回第二个参数(设置的默认值);这里的修饰符default是用在接口方法中,表示这个方法在接口中已经实现了,子类可以不实现(Java8开始支持)Set<K> keySet()
:返回Map中Key的集合;之所以返回Set,是因为Map中的key不能有重复,所以用Set最适合了Collection<V> values()
:返回Map中Values的集合
下面我们简单看下三者的区别
HashMap
TreeMap
LinkedHashMap
访问速度
快
慢
适中
元素是否有序
无序
有序,默认按key排序
有序,默认按插入的顺序
适用场景
普通的插入,查询(用的最多)
需要对key进行排序的场景(比如员工按年龄排序等)
需要保证查询和插入顺序一致的场景(类似队列)
接下来我们以HashMap为例,来介绍Map接口
HashMap
HashMap内部是数组+链表的结构;
因为在添加键值对的时候,Key做了hash处理,然后按照hash值进行排列;
- 如果hash值没有重复,就按照数组的方式依次排列;
- 如果hash值有重复的,就添加到已有的键值对后面(Java8以后是尾部插入),形成链表结构;
整体结构 如下图所示
这里只是简单介绍,以后再深入了解
下面用代码示范一下
// 键值对集合,键不可以重复
Map<String, Integer> map = new HashMap<>();
// 添加:首先会检查对应的key是否存在,如果不存在,则新建键值对,然后填充;如果存在,则覆盖已有的值
map.put("a", 1); // 这里的1会自动装箱为Intege类型
// 查询
int value1 = map.get("a");
int value2 = map.get("b");
System.out.println(map);
这里有个很有意思的现象,你觉得value2会是多少呢?
答案是多少都不是,因为程序运行到这一行就出错了,报空指针异常
不应该返回null吗?怎么会出错?
这里涉及到拆箱和装箱的问题,上面我们在添加put的时候,int 1自动装箱为Integer;
然后在获取get的时候,对应的也是要进行拆箱的,将Integer转为int;
但是由于获取的value = null,所以就相当于对null进行拆箱,结果就报错了。
解决办法就是严格按照Map的类型信息进行添加和获取;
将上面的代码加以修改,如下所示
// 键值对集合,键不可以重复
Map<String, Integer> map = new HashMap<>();
// 添加:首先会检查对应的key是否存在,如果不存在,则新建键值对,然后填充;如果存在,则覆盖已有的值
map.put("a", 1); // 这里的1会自动装箱为Intege类型
// 查询
Integer value1 = map.get("a");
Integer value2 = map.get("b");
System.out.println(map);
此时value2就等于null了。
关于自动装箱和拆箱,网上资源很多,这里就不再细说了
TreeMap
TreeMap在插入的时候,可以按照键的顺序进行排序
它适合用在排序比较多的场景,性能会比HashMap差一些
LinkedHashMap
LinkedHashMap拥有HashMap的大部分优点,且保证了插入的顺序,使得在查询的时候,可以按照插入的顺序依次读取
三者的排序比较
下面用代码演示一下,依次插入100个数,看看他们分别是怎么排序的
HashMapDemo.java
public class HashMapDemo {public static void main(String[] args) {// 键值对集合,键不可以重复Map<String, Integer> map = new HashMap<>();// 倒序插入100个数int i =100;while (i-->0){map.put(""+i, i);}// 查询for (String str :map.keySet()) {// 这里会乱序输出System.out.println(str);}}
}
输出如下所示:很乱
TreeMapDemo.java
public class MapDemo {public static void main(String[] args) {// TreeMapMap<String, Integer> map1 = new TreeMap<>();// 连续倒序插入100个数int k =100;while (k-->0){map1.put(""+k, k);}// 查询for (String str :map1.keySet()) {// 这里会正序输出System.out.println(str);}}
}
输出如下所示:
细心的你们,应该会发现上面的输出有点别致
那是因为这里的键key(0~99)其实不是整型,而是字符串类型,所以排序按照字符串的升序来排,才会出现如图所示的结果
(建议实际场景不要这样搞,容易出事,字符串尽量不要用纯数字,而是要跟字母做拼接;)
正确的做法是key=“a”+i,这种方式
LinkedHashMapDemo.java
public class MapDemo {public static void main(String[] args) {// LinkedHashMapMap<String, Integer> map2 = new LinkedHashMap<>();// 倒序插入100个数int j =100;while (j-->0){map2.put("a"+j, j);}for (String str :map2.keySet()) {// 这里按照插入的顺序依次输出System.out.println(map2.get(str));}}
}
输出如下所示:
总结
Map一般用到的有HashMap,TreeMap,LinkedHashMap,当然还有并发相关的,这里入门级别的先不涉及(比如ConcurrentHashMap)
HashMap的插入和访问都很快,但是内部是无序排列
TreeMap的插入和访问都很慢,但是内部是有序排列,默认按key升序排列
LinkedHashMap拥有HashMap的大部分优点,而且还可以按照元素插入的顺序来访问元素,但是性能会比HashMap差
后记
最后,感谢大家的观看,谢谢
Java中的映射Map - 入门篇相关推荐
- Java中的集合List - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合List - 入门篇>,希望对大家有帮助,谢谢 简介 说实话,Java中的集合有很多种,但是这里作为入门级别,先简单介绍第一种 ...
- Java中的模块(Module)入门介绍
Java中的模块(Module)入门介绍 在Java 9版本中Java 语言引入了一个非常重要的概念:模块(module).module引入了Java代码分组的另一个级别.每个module都包含许多子 ...
- java中map怎么遍历,Java中怎么遍历Map的所有的元素
Java中怎样遍历Map的所有的元素 JDK1.4中 view plaincopy to clipboardprint? Map map = new HashMap(); Iterator it = ...
- java list for循环遍历_详解Java中list,set,map的遍历与增强for循环
详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...
- java集合for循环_详解Java中list,set,map的遍历与增强for循环
详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...
- java 怎么获取键的值_在 Java 中如何获取 Map 的所有键和值
在 Java 中可以通过 map.entrySet() 方法获取 Map 的所有键和值. Map map = new HashMap<>(); // Get keys and values ...
- UI设计中Sketch使用指南—入门篇
对于UI设计师而言,Sketch充满了新鲜空气. 我想说:感谢sketch让Photoshop不再是UI设计师必备软件.这时候很多初学者的UI设计师对sketch充满了兴趣,甚至踊跃学习.下面胡老师给 ...
- 《鬼谷子》中的沟通技巧——入门篇
<鬼谷子>中的沟通技巧--入门篇 PMP 关劲松 u 一.鬼谷子简介 鬼谷子,姓王名诩,春秋时人.常入云梦山采药修道.因隐居清溪之鬼谷,故自称鬼谷先生.鬼谷子为纵横家之鼻祖, ...
- java中list和map详解
java中list和map详解 一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedL ...
最新文章
- acitivity 和fragment 通信,使用广播来传递信息的问题
- 在Linux上限制远程登陆的IP
- Java基本数据类型及String类
- java mawen介绍_Maven的介绍及使用
- SAP Commerce Cloud WCMS 里的 home 页面和 SAP Spartacus Page API 返回的数据比较
- c++ 添加按钮_使用 Visual Studio 2019 批量添加代码文件头
- vue.js学习笔记1——安装及创建并运行vue实例
- 如何检验java环境变量是否配好_如何验证Java环境变量配置成功
- 西威变频器avo下载调试资料_双色图解变频器及软起动器控制线路
- Request header field x-token is not allowed by Access-Control-Allow-Headers in preflight response.
- Deepin 深度Linux系统安装教程
- 安卓如何调出软键盘_Android软键盘-显示隐藏软键盘
- 什么是SMART原则
- 安装显卡后蓝屏0x00000116解决办法
- linux限制message日志大小,message显示rsyslog日志服务警告信息due to rate-limiting
- 步进电机主要技术参数
- 解决IOS微信浏览器底部会出现向前向后返回按钮问题
- 硬盘检测工具HARD DISK SENTINEL PRO(硬盘哨兵)v5.70便携版
- Java-ZZH1-78面试题
- ARM面试总结(1)