HashMap是最常用的Map接口实现类,HashMap根据键的Hash值计算元素的存储位置,并将Hash值和元素同时存储起来,程序访问该存储元素时,只需要提供Hash值就可以,其访问速速非常高效。
HashMap同HashSet类似,也是根据元素的哈希码(Hash值)进行存储的,HashMap根据每个存储对象的哈希码,用固定的算法算出它的存储索引,把存储元素存放在一个叫做散列表的相应位置中。当后加入元素的哈希码与已经加入的元素哈希码相同时,HashMap就会创建一个链表,将相同哈希码的元素存入一个链表,并将该链表的头指针存储到哈希码对应的数组元素中。HashMap存储结构如下图所示:

HashMap存储结构
哈希码(Hash值)计算方式通过Object类的hashcode获取,代码如下:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}代码通过hashcode的高16位实现,能保证数组的长度比较小的时候,保证高低bit都参与到hash计算中,不会有大的开销。
需要注意的是,虽然HashMap和HashSet实现的接口规范不同,但是它们底层的 Hash 存储机制完全相同。实际上,HashSet 本身就是在 HashMap 的基础上实现的。
HashMap在实际编程中,应用非常广泛。例如,在员工管理信息系统中,需要按照员工号来存储大量的员工信息,并且要考虑到查速度。这时就可以使用HashMap作为员工信息的存储结构,将员工号作为键值,员工对象作为值来存储到HashMap中。
案例1:编写一个程序,用于简单统计各个单词出现的次数,key为单词,value为次数,使用HashMap存储。
在PCoreUnit5项目新建map包,在map包下新建HashMapTest1类。代码如下:
package map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* @ClassName: HashMapTest1
* @Description: 集合框架(HashMap类)案例1
* @author 编程训练营
* @date
*
*/
public class HashMapTest1 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
*
* @return void 返回类型 @throws
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一句英语,单词间用空格隔开:");
String sentence = sc.nextLine();
String[] arr = sentence.split(" ");
// 键代表着单词,值代表着次数
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0; i < arr.length; i++) {
// 判断单词(key)是否在Map内
if (!map.containsKey(arr[i])) {
// 添加key-value键值对到map
map.put(arr[i], 1);
} else {
// 单词(key)已在Map内
int num = map.get(arr[i]);
// 覆盖key对应的value
map.put(arr[i], ++num);
}
}
System.out.println("统计单词出现的个数,结果如下:");
// 从map获取所有key
Set<String> set = map.keySet();
// 遍历key所在的set集合
for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
String key = iterator.next();
// 获取指定key的value
Integer value = map.get(key);
System.out.println(key + "=" + value);
}
}
}该程序用于简单统计各个单词出现的次数。因为HashMap存储的是键值对,因此不能用迭代器、foreach等方法遍历HashMap。如果需要遍历HashMap,可以通过HashMap的keySet方法返回HashMap中key值的集合,通过遍历Key值集合读取HashMap中的元素。程序输出结果如下图所示:
程序执行结果如下图所示:

在Map集合中,存储的元素是通过Key来进行访问的,Key是一个字符串,通过Key可以直接访问Map存储的元素。在Map集合中,Key和value是映射关系,key—value也称为键值对。