HashMap遍历这么玩儿

77 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 

一、什么是HashMap

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。

Java8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑 树 组成。HashMap 里面是一个Entry数组,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next;然后数组中每个元素是一个单向链表;当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。

  1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
  2. loadFactor:负载因子,默认为 0.75。
  3. 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)
}