携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
一、什么是HashMap
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
Java8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑 树 组成。HashMap 里面是一个Entry数组,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next;然后数组中每个元素是一个单向链表;当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。
- capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
- loadFactor:负载因子,默认为 0.75。
- threshold:扩容的阈值,等于 capacity * loadFactor
二、HashMap的特性
1、线程不安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。
2、HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。
3、HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快 的访问速度,但遍历顺序却是不确定的。
三、HashMap的遍历方式
1、for循环
Map<Object, Object> map = new HashMap<>();
map.put("name", "RebornChang");
map.put("gender", "男");
map.put("phone", "18888888888");
map.put(null, null);
//1.Map的迭代
// 通用的Map迭代方式
System.out.println("==============Map的迭代======================");
for (Map.Entry<Object, Object> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
System.out.println("====================================");
2、foreach
// JDK8的迭代方式
map.forEach((key, value) -> {
System.out.println(key + ":" + value);
});
3、迭代器Iterator
Set set = map.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry<String, String> entry1=(Map.Entry<String, String>)i.next();
System.out.println(entry1.getKey()+"=="+entry1.getValue());
}
4、keySet迭代
Iterator it=map.keySet().iterator();
while(it.hasNext()){
String key;
String value;
key=it.next().toString();
value=map.get(key);
System.out.println(key+"--"+value);
}