Java——类集框架:Map集合的详解及应用举例
1、Map接口的定义
Map保存的是二元偶对象,简单说就是两个值,key和value。使用中可以通过key查找到value数据,使用Map可以方便用户查询。
Map中定义的关键操作方法:
名称 |
作用 |
---|---|
public V put(K key, V value) |
向集合中追加数据 |
public V get(K key) |
根据key返回对应的value数据 |
public Set<K> keySet() |
返回Map中的所有key |
public Set<Map.Entry<K,V>> entrySet() |
将Map集合转换为Set集合 |
Map接口中有两个常用的子类:HashMap、Hashtable,通过这两个子类进行Map的实例化。
2、HashMap子类
HashMap接口在JDK1.2中开始定义,开发中应用的最多的一个子类。
【举例】:Map的基本操作
Map<String,Integer> map = new HashMap<>();
map.put("张三",10);
map.put("李四",20);
map.put("赵五",18);
System.out.println(map);
Map集合的数据是无序的,也不需进行排序,因为Map集合应用的目的不是为了输出,是为了查询使用。
Map可以保存null值,但这种输出的操作形式并不理想,因为Map主要就是用于查询使用,key不存在值,返回为null。
【举例】Map接口中i当以有keySet方法,可以获取全部key的信息:
Map<String,Integer> map = new HashMap<>();
map.put("张三",10);
map.put("李四",20);
map.put("赵五",18);
map.put(null,0);
map.put("empty",null);
Set<String> set =map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
注意:如果Map集合中使用重复的key保存,则旧内容将被新内容覆盖。
3、Hashtable子类(旧的子类)
Hashtable与Vctor、Enumeration都是JDK1.0推出,1.2后重新设计,1.2后其也变成了Map的子类。HashMap与Hashtable的具体区别是什么呢?(区别类似于ArrayList与Vector):
序号 |
区别点 |
HashMap(90%) |
Hashtable(20%) |
||
---|---|---|---|---|---|
1 |
推出时间 |
JDK1.2 |
JDK1.0 |
||
2 |
性能 |
异步处理,性能较高 |
同步处理,性能较低 |
||
3 |
安全性 |
非线程安全的操作 |
线程安全操作 |
||
4 |
保存null |
key或value允许为null |
不允许为null |
不允许为null |
|
不允许为null |
开发中无法回避null的问题,所以最好使用HashMap.
4、排序的子类:TreeMap
了解即可,该子类保存的数据可以实现key排序操作,TreeMap 的value可以保存null,Key不可以保存null,key的排序一定是参照comparable接口的执行结果。
Map<Integer,String> map = new TreeMap<>();
map.put(1,"大哥");
map.put(3,"老三");
map.put(2,"老二");
System.out.println(map);
5、利用Iterator输出Map集合
在Collection接口中会提供iterator()方法,可以直接为Iterator接口实例化,但Map接口未提供,该如何利用Iterator进行输出呢?首先针对Map与Collection数据保存过程做一个比较:
要利用Iterator输出Map集合 数据,首先看下Map.Entry接口,其包括的方法:
- 取得包装的key:public K getKey();
- 取得包装的value:public V getValue();
那么,Map接口基于Iterator输出的步骤如下:
1)利用Map接口中的entrySet方法将Map集合变为Set集合;
2)Set集合定义了iterator()方法,可以实例化Iterator接口;
3)利用Iterator接口迭代输出,找出每个Map.Entry接口对象,利用getKey()与getValue()方法获取对应值。
【举例】:利用Iterator输出Map集合
Map<String,Integer> map = new HashMap<>();
map.put("张三",10);
map.put("李四",20);
map.put("赵五",18);
Set<Map.Entry<String,Integer>> set = map.entrySet();
Iterator<Map.Entry<String,Integer>> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
6、自定义Map中的key
不再写代码举例,既然涉及查找,就涉及到对象是否想等比较,自定义的key 类 要覆写hashCode()、equals()方法,否则查找无效。实际开发过程中,Map的核心功能就是查找,优先考虑的key类型为Interger、String类型,这两个都已经覆写了hashCode()、
equals(),写实现了Comparable接口,因此在开发中不建议使用自定义类型。
7、总结
1)Mapj接口主要进行查询应用,常用的子类为HashMap,可以保存null;
2)Map使用Iterator输出的步骤方法;
3)建议使用系统类String、Integer作为key类型,不使用自定义的key。
- shell脚本中字符串的常见操作及"command not found"报错处理(附源码)
- 绝对定位下的盒模型
- 运行shell脚本时报错"[[ : not found"解决方法
- 关于表联结方法(二) (r4笔记第23天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
- XSS分析及预防
- 关于ORA-01779问题的分析和解决 (r4笔记第22天)
- 想看爱奇艺VIP视频?一个python脚本帮你搞定
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势
- 关于shell中的pl/sql脚本错误排查与分析(r4笔记第21天)
- 关于BFC不会被浮动元素遮盖的一些解释
- MyBatis + MySQL返回插入成功后的主键id
- struts2+spring+hibernate整合步骤(1)
- 微信公众号问题:{"errcode":40125,"errmsg":"invalid appsecret, view more at http://t.cn/LOEdzVq, hints: [
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释