Map接口
特点
- Map与Collection并列存在,用于保存具有映射关系的数据
- Map中可以和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
- Map中的key不允许重复,value可以重复
- Map中的key可以为null,value也可以为空。key只能有一个为null,value可以多个为null
- 常用的String类作为Map的key
- key和value之间存在单向一对一关系,即可通过指定的key总能找到对应的value。
常用方法
- put 添加
- remove 根据键删除映射关系
- get 根据键获取值
- size 获取元素个数
- isEmpty 判断个数是否为零
- clear 清除
- containsKey 查找键是否存在
遍历方法
第一组:先取出所有的key,通过可以取出对应的vaule
1 增强for循环
Set keyset = map.keySet();
for(Object key : keyset){
sout(map.get(key));
}
2 迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
Object key = iterator.next();
sout(map.get(key));
}
第二组先把所有的vaules取出
Collection vaules = map.values();
1 增强for循环
//使用所有的Collections使用的遍历方法
for(Object value : values){
sout(value);
}
2 迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
Object value = iterator.next();
sout(value);
}
通过EntrySet获取
Set entrySet = map.entrySet();
//EntrySet<Map.Entry<K,V>>
1 增强for循环
for(Object entry : entrySet){
Map.Entry m = (Map.Entry) entry;
sout(m.getkey() + m.getValue());
}
2 迭代器
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()){
Object entry = iterator.next();
Map.Entry m = (Map.Entry) entry;
sout(m.getkey() + m.getValue());
}
HashMap小结
- Map接口常用实现类:HashMap、HashTable和Properties
- HashMap是Map接口使用频率最高的实现类
- HashMap是key-value对的方式来存储数据(HashMap$Node类型)
- key可以为null,value也可以为空。key只能有一个为null,value可以多个为null
- 如果添加key,则会覆盖原有的对
- 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的
- HashMap没有实现同步,因此线程是不安全的
HashMap扩容机制
- HashMap底层维护了Node类型的数组table,默认null
- 当创建对象时,将加载因子(loadfactor)初始化为0.75
- 当添加key-value时,通过key的哈希值得到table的索引,然后判断该索引处是否有元素,没有则直接添加。如果该索引处有元素,继续判断该元素的key和准备加入的key是否相等,如果相等,则替换value;如果不相等需要判断树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容
- 第一次添加,则需要扩容table容量为16,临界值(threshold)为12
- 以后再扩容,则需要table容量为原来的2倍(32),临界值为原来的2倍(24)。
- 在java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64),就会进行红黑树化