HashMap基础
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。另外,HashMap是非线程安全的,也就是说在多线程的环境下,可能会存在问题,而Hashtable是线程安全的。
HashMap类图:
一、HashMap常用方法
package collection;
import java.util.*;
/**
* @author XuqiangDuan
* @Date 2018/9/14 16:45
**/
public class MapDemo {
/**
* @deprecated 该标记为已弃用
* HashMap 常用方法
*/
public static void mapMethod() {
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("a", 1);
hashMap.put("b", 2);
hashMap.put("c", 3);
hashMap.put("d", 4);
hashMap.put("e", 5);
//size
System.out.println("size: " + hashMap.size());
//values
System.out.println("values: " + hashMap.values());
//keys
System.out.println("keys: " + hashMap.keySet());
//entry
System.out.println("entrySet : " + hashMap.entrySet());
Set set = hashMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
System.out.println("key:" + entry.getKey() + " - value:" + entry.getValue());
}
/*
* putAll
* 合并时,key相同value更新
*/
HashMap<String, Integer> hashMapN = new HashMap<>();
hashMapN.put("e", 55);
hashMapN.put("f", 66);
hashMapN.put("g", 77);
hashMapN.put("h", 88);
hashMapN.put("i", 99);
hashMapN.putAll(hashMap);
System.out.println("N合并后 size: " + hashMapN.size());
System.out.println("N合并后 values: " + hashMapN.values());
//JDK8-lambda表达式
hashMapN.forEach((k, v) -> {
System.out.println(k + " : " + v);
});
//remove
hashMap.remove("a");
System.out.println("remove后的size : " + hashMap.size());
//clear
hashMap.clear();
System.out.println("clear后的size : " + hashMap.size());
}
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
//HashMap方法
MapDemo.mapMethod();
}
}
二、Java 8 HashMap优化特性
小结
- 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容;
- 负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊;
- HashMap是线程不安全的,不要在并发的环境中同时操作HashMap,建议使用ConcurrentHashMap;
- JDK1.8引入红黑树大程度优化了HashMap的性能。