Java 集合深入理解(14):Map 概述
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~
终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍。
什么是 Map
Java 中的 Map 接口 是和 Collection 接口 同一等级的集合根接口,它 表示一个键值对 (key-value) 的映射。类似数学中 函数 的概念。
数学中的函数:
一个 Map 中,任意一个 key 都有唯一确定的 value 与其对应,这个 key-value 的映射就是 map。
Map 中元素的顺序取决于迭代器迭代时的顺序,有的实现类保证了元素输入输出时的顺序,比如说 TreeMap;有的实现类则是无序的,比如 HashMap。
Map 的三个 collection 视图:
Map 接口提供了三种角度来分析 Map:
- KeySet
- Values
- Entry
1.KeySet
KeySet 是一个 Map 中键(key)的集合,以 Set 的形式保存,不允许重复,因此键存储的对象需要重写 equals() 和 hashCode() 方法。
在上图就是保存 AA, BB, CC, DD… 等键的集合。
可以通过 Map.keySet() 方法获得。
2.Values
Values 是一个 Map 中值 (value) 的集合,以 Collection 的形式保存,因此可以重复。
在上图就是保存 90,90,56,78… 等值的集合。
通过 Map.values() 方法获得。
3.Entry
Entry 是 Map 接口中的静态内部接口,表示一个键值对的映射,例如上图中 AA-90 这一组映射关系。
Entry 具有上图中的方法:
- getKey() , 获取这组映射中的键 key
- getValue() , 获取这组映射中的值 value
- setValue() , 修改这组映射中的值
- hashCode() , 返回这个 Entry 的哈希值
- equals() , 对比 key-value 是否相等
通过 Map.entrySet() 方法获得的是一组 Entry 的集合,保存在 Set 中,所以 Map 中的 Entry 也不能重复。
public Set<Map.Entry<K,V>> entrySet();
Map 的三种遍历方式
根据 Map 提供的三种视图,可以有三种 map 遍历方式 :
1.使用 keySet 遍历:
Set set = map.keySet();
for (Object key : set) {
System.out.println(map.get(key));
}
2.使用 values 遍历:
Collection values = map.values();
Iterator iterator = values.iterator();
while (iterator.hasNext()){
System.out.println("value " + iterator.next());
}
3.使用 Entry 遍历
Set entrySet = map.entrySet();
for (Object o : entrySet) {
Map.Entry entry = (Map.Entry) o;
System.out.println(entry); //key=value
System.out.println(entry.getKey() + " / " + entry.getValue());
}
Map 的实现类
Map 的实现类主要有 4 种:
- Hashtable
- 古老,线程安全
- HashMap
- 速度很快,但没有顺序
- TreeMap
- 有序的,效率比 HashMap 低
- LinkedHashMap
- 结合 HashMap 和 TreeMap 的有点,有序的同时效率也不错,仅比 HashMap 慢一点
其中后三个的区别很类似 Set 的实现类:
- HashSet
- TreeSet
- LinkedHashSet
Map 的每个实现类都应该实现 2 个构造方法:
- 无参构造方法,用于创建一个空的 map
- 参数是 Map 的构造方法,用于创建一个包含参数内容的新 map
第二种构造方法允许我们复制一个 map。
虽然没有强制要求,但自定义 Map 实现类时最好都这样来。
总结
Map 有以下特点:
- 没有重复的 key
- 每个 key 只能对应一个 value, 多个 key 可以对应一个 value
- key,value 都可以是任何引用类型的数据,包括 null
- Map 取代了古老的 Dictionary 抽象类
注意:
可以使用 Map 作为 Map 的值,但禁止使用 Map 作为 Map 的键。因为在这么复杂的 Map 中,equals() 方法和 hashCode() 比较难定义。
另一方面,你应该尽量避免使用“可变”的类作为 Map 的键。如果你将一个对象作为键值并保存在 Map 中,之后又改变了其状态,那么 Map 就会产生混乱,你所保存的值可能丢失。
Thanks
https://docs.oracle.com/javase/8/docs/api/java/util/Map.html
https://docs.oracle.com/javase/tutorial/collections/interfaces/map.html
https://docs.oracle.com/javase/tutorial/collections/implementations/map.html
http://www.cnblogs.com/skywang12345/p/3308931.html
http://www.nowamagic.net/librarys/veda/detail/1202
Java 集合深入理解(14):Map 概述的更多相关文章
- Java 集合深入理解(4):List<E> 接口
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...
- Java 集合深入理解(8):AbstractSequentialList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...
- Java 集合深入理解(7):ArrayList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...
- Java 集合深入理解(15):AbstractMap
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天来了解下 AbstractMap. 什么是 AbstractMap AbstractMap 是 Map 接口的的实现类 ...
- Java 集合深入理解(3):Collection
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象: 集合可以对 ...
- java 集合框架(十六)Map
一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...
- Java集合必会14问(精选面试题整理)
前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没 ...
- Java 集合系列之五:Map基本操作
1. Java Map 1. Java Map 重要观点 Java Map接口是Java Collections Framework的成员.但是它不是Collection 将键映射到值的对象.一个映射 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
随机推荐
- WIN7下更改TFS连接用户的方法
如果你在第一用VS连接TFS的时候,当你输入完用户名和密码并点击保存时,你的用户登录信息就保存在Credential Manager. 你可以到 Control Panel->User Acco ...
- WCF学习笔记
1,关于WCF/web service/WSE Web Service:是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术.它有一套完成的规范体系标准,而且在持 ...
- 建库和表的脚本.sql
1.一直都记不太清楚,需要新建一个数据库和表的脚本是怎样的,恰巧今天翻到了,特地记录下来,希望以后用的时候记住吧! create database testdb00; use testdb00; cr ...
- 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...
- 在 Visual C# 项目中调用 VBA 中的代码
https://msdn.microsoft.com/zh-cn/library/Bb608613.aspx http://www.cnblogs.com/yangbin1005/archive/20 ...
- mybatis 语句共享
在mybatis mapping文件中,有些情况下有些语句需要共享给其他sql语句使用. 在网上搜了一下没有结果. 自己动手做了一个单元测试. 示例如下: 比如我在sysuser.xml 中有如下语句 ...
- 面向对象编程(OOP)基础之UML基础
在我们学习OOP过程中,难免会见到一些结构图~各种小框框.各种箭头.今天小猪就来简单介绍一下这些框框箭头的意思——UML. UML定义的关系主要有:泛化(继承).实现.依赖.关联.聚合.组合,这六种关 ...
- windows下mysql主从同步备份步骤
目的:有两台MySQL数据库服务器A和B,使A为主服务器,B为从服务器,初始状态时,A和B中的数据信息相同,当A中的数据发生变化时,B也跟着发生相应的变化,使得A和B的数据信息同步,达到备份的目的. ...
- java面向对象编程— —第七章 继承
7.1继承的起源 继承(Inheritance),即在面向对象编程中,可以通过扩展(extends)一个已有的类,并继承该类的属性的行为,来创建一个新的类. 已有的类称为父类(也可以称为基类,超类), ...
- 如果解决ubuntu tab键不能提示命令
/bin/sh is symlinked to /bin/dashTo change it, do:sudo rm /bin/shsudo ln -s /bin/bash /bin/sh 原文:htt ...