目录
Map接口简介
Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。Map 中的 key 和value 都可以是任何引用类型的数据。常用String类作为Map的“键”。
Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。
key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。
Map接口的常用实现类:HashMap、TreeMap和Properties。
Map常用方法
添加、删除操作:
Object put(Object key,Object value)
|
将指定
key-value
添加到
(
或修改
)
当前
map
对象中
|
void putAll(Map m)
|
将
m
中的所有
key-value
对存放到当前
map
中
|
Object remove(Object key)
|
移除指定
key
的
key-value
对,并返回
value
|
void clear()
|
清空当前
map
中的所有数据
|
元素查询的操作:
Object get(Object key)
|
获取指定
key
对应的
value
|
boolean containsKey(Object key)
|
是否包含指定的
key
|
boolean containsValue(Object value)
|
是否包含指定的
value
|
int size()
|
返回
map
中
key-value
对的个数
|
boolean isEmpty()
|
判断当前
map
是否为空
|
boolean equals(Object obj)
|
判断当前
map
和参数对象
obj
是否相等
|
元视图操作的方法:
Set keySet()
|
返回所有
key
构成的
Set
集合
|
Collection values()
|
返回所有
value
构成的
Collection
集合
|
Set entrySet()
|
返回所有
key-value
对构成的
Set
集合
|
Map.Entry接口
Map.Entry是Map中内部定义的一个接口,专门用来保存key,value的内容。
Map.Entry接口定义:public static interface Map.Entry<K,V>
Map的遍历
//这里的非系统类Teacher作为Map的key,必须重写Object的hashCode()和equals()方法
//1.将Map的实例通过entrySet()方法变为Set接口
Set<Map.Entry<Teacher, String>> set = map.entrySet();
//2.通过Set接口实例为Iterator实例化
Iterator<Map.Entry<Teacher, String>> it = set.iterator();
//3.通过Iterator迭代输出,每个内容都是Map.Entry的对象
while(it.hasNext()){
System.out.println(it.next()); //输出全部的key->value
}
Set<Teacher> keys = map.keySet();
Iterator<Teacher> it1 = keys.iterator();
while(it1.hasNext()){
System.out.println(it1.next()); //输出全部的key
}
Collection<String> cols = map.values();
Iterator<String> it2 = cols.iterator();
while(it2.hasNext()){
System.out.println(it2.next()); //输出全部的value
}
Map实现类之一:HashMap
HashMap是 Map 接口使用频率最高的实现类。
HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。与HashSet一样,此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。
HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
HashMap的存储结构
JDK 7及以前版本:HashMap是数组+链表结构(即为链地址法)。
从上图中可以看出,HashMap 底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个 HashMap 的时候,就会初始化一个数组。源码如下:
transient Entry[] table;
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
final int hash;
……
}
可以看出,Entry 就是数组中的元素,每个Map.Entry 其实就是一个 key-value 对,它持有一个指向下一个元素的引用,这就构成了链表。
JDK 8版本发布以后:HashMap是数组+链表+红黑树实现。
HashMap的构造器
HashMap():构建一个初始容量为16,负载因子为 0.75 的 HashMap。
HashMap(int initialCapacity):构建一个初始容量为 initialCapacity,负载因子为 0.75 的 HashMap。
HashMap(int initialCapacity, float loadFactor):以指定初始容量、指定的负载因子创建一个 HashMap。
initialCapacity: HashMap 的最大容量,即为底层数组的长度。
loadFactor:负载因子 loadFactor 定义为:散列表的实际元素数目(n)/ 散列表的容量(m)。
HashMap的常用方法
方法 | 描述 |
---|---|
clear() | 删除 hashMap 中的所有键/值对 |
clone() | 复制一份 hashMap |
isEmpty() | 判断 hashMap 是否为空 |
size() | 计算 hashMap 中键/值对的数量 |
put() | 将键/值对添加到 hashMap 中 |
putAll() | 将所有键/值对添加到 hashMap 中 | </