1. Map 接口及其实现类
Map
是一种映射关系的集合, 它将键映射到值的对象.
一个映射不能包含重复的键; 每个键最多只能映射到一个值.Map
中的键值对称为Entry
.Map
是由多个Entry
所组成的集合.Map
底层可以看作是使用了两个集合分别存储键和值,key
集合类似于Set
类型集合,value
集合则类似于List
集合.Map
接口提供三种collection
视图, 允许以键集, 值集
或键-值映射关系集的形式查看某个映射的内容.注意:
Map
接口并没有继承Collection
接口和Iterable
接口,
因此不能直接对Map
使用for-each
操作.
1.1. Map 中常用的方法
1.1.1. 增加
put(K key, V value)
方法:- 定义:
V put(K key, V value)
- 作用:
将指定的值与此映射中的指定键关联. - 返回:
以前与key
关联的值, 如果没有针对key
的映射关系, 则返回null
- 定义:
putAll(Map<? extends K,? extends V> m)
方法:- 定义:
void putAll(Map<? extends K,? extends V> m)
- 作用:
从指定映射中将所有映射关系复制到此映射中.
- 定义:
1.1.2. 删除
clear()
方法:- 定义:
void clear()
- 作用:
此映射中移除所有映射关系. 此调用返回后, 该映射将为空
- 定义:
remove(Object key)
方法:- 定义:
V remove(Object key)
- 作用:
如果存在一个键的映射关系, 则将其从此映射中移除 - 返回: 以前与
key
关联的值; 如果没有, 则返回null
- 定义:
1.1.3. 查询
get(Object key)
方法:- 定义:
V get(Object key)
- 作用:
返回指定键所映射的值, 如果此映射不包含该键的映射关系, 则返回null
- 定义:
size()
方法:- 定义:
int size()
- 作用:
返回此Map
中键值对的数量
- 定义:
containsKey(Object key)
和containsValue(Object value)
方法:
作用:
查找Map
中是否存在指定的键或值, 存在则返回true
1.1.4. 获取集合
keySet()
方法:- 定义:
Set<K> keySet()
- 作用:
获取Map
中所有key
组成的Set
集合
- 定义:
values()
方法:- 定义:
Collection<V> values()
- 作用:
获取Map
中所有value
组成的集合.
返回的是一个Collection
, 要定义泛型接收.
- 定义:
entrySet()
方法:- 定义:
Set<Map.Entry<K,V>> entrySet()
- 作用:
将所有键值对存进一个Set
集合中返回.
- 定义:
1.2. Set 和 Map 之间的关系
每个
Set
的实现类底层调用的是相同算法的Map
的实现类.它通过把
Set
的集合对象作为Map
中的key
进行存储,
再用一个Object
常量作为value
映射到每个key
上.因此在很多操作上,
Set
和Map
都是相似的.
1.3. HashMap 类
- 此类是基于哈希表的
Map
接口的实现, 底层采用哈希表算法. - 此实现提供所有可选的映射操作, 并允许使用
null
值和null
键. - 此类不保证映射的顺序, 也不允许
key
有重复. key
判断重复也需要覆盖equal()
和hashCode()
方法.
1.4. TreeMap 类
- 此类是基于红黑树的
Map
实现, 底层使用红黑树算法. - 该
Map
在键值对加入时会根据key
来进行排序, 同时key
也不允许重复. - 排序也分为自然排序和定制排序两种规则.
- 判断重复的标准也是根据排序规则返回值是否为
0
决定.
1.5. LinkedHashMap 类
- 此类是
Map
接口的哈希表和链接列表实现, 底层采用哈希表算法和链表算法. - 此类会记录键值对的加入顺序.
- 此类是
HashMap
的子类, 因此其它特点与父类相同.
1.6. Hashtable 类
- 该类在 JAVA 集合框架提出之前, 用于表示映射关系.
- 采用哈希表算法, 是
HashMap
的前身. 类似Vector
和ArrayList
的关系. - 该类所有方法都是
synchronized
修饰的, 因此它线程更安全但性能较低. - 该类已被取代, 不建议使用.
1.7. Properties 类
- 是
Hashtable
的子类, 并要求key
和value
都是String
类型. - 该类有自己专门的
get
和set
方法对数据进行操作. - 该类主要用来加载资源文件, 可保存在流中或从流中加载.