直通车:Java集合框架系列目录
- 基本概念
- 继承关系
- 结构特点
- 常用API
- 遍历方式
- 代码示例
1.基本概念
HashMap:一种存储键/值关联的数据结构。
2.继承关系
HashMap是一个继承于AbstractMap的散列表,它存储的内容是键值对(key/value)映射。
HashMap实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
HashMap实现java.io.Serializable接口,意即HashMap支持序列化,能通过序列化传输。
3.结构特点
- 采用“链地址法”
链地址法,意即数组加链表的结合。在每个数组元素上都有一个链表结构,HashMap通过HashCode对其要插入(put)或查找(get)的元素进行数组元素的快速匹配。 - 数组初始大小为16,后每次扩容一定是2的幂
当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值—即当前数组的长度乘以加载因子的值,就会自动扩容。(加载因子默认为0.75) - 元素无序排列
元素处于哪个“哈希桶”(“桶”即数组元素)取决于键(Key)的哈希值(HashCode)。元素具体在链表的哪个位置只能通过遍历得到。 - 存储键/值对
键(Key)与值(Value)共同存储在entry节点中,HashMap存储entry节点。
HashMap最多只允许一条记录的键为Null(多条会覆盖),允许多条记录的值为 Null。 - 不是线程安全的
可以用 Collections的synchronizedMap
方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
。
4.常用API
API | 含义 |
---|---|
clear() | 从 Map 中删除所有映射 |
remove(Object key) | 从 Map 中删除键和关联的值 |
put(Object key, Object value) | 将指定值与指定键相关联 |
putAll(Map t) | 将指定 Map 中的所有映射复制到此 map |
entrySet() | 返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素 |
keySet() | 返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值) |
values() | 返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值) |
get(Object key) | 返回与指定键关联的值 |
containsKey(Object key) | 如果 Map 包含指定键的映射,则返回 true |
containsValue(Object value) | 如果此 Map 将一个或多个键映射到指定值,则返回 true |
isEmpty() | 如果 Map 不包含键-值映射,则返回 true |
size() | 返回 Map 中的键-值映射的数目 |
5.遍历方式
1.遍历HashMap的键值对
第一步:根据entrySet()获取HashMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer integ = null;
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
// 获取key
key = (String)entry.getKey();
// 获取value
integ = (Integer)entry.getValue();
}
2.遍历HashMap的键
第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
String key = null;
Integer integ = null;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
// 获取key
key = (String)iter.next();
// 根据key,获取value
integ = (Integer)map.get(key);
}
3.遍历HashMap的值
第一步:根据value()获取HashMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer value = null;
Collection c = map.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
6.代码示例
package com.sort;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* 统计一句英语的简单统计各个单词出现的次数
*
* @author Owner
*
*/
public class MapTest3 {
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++) {
if (!map.containsKey(arr[i])) {
map.put(arr[i], 1);
} else {
// 说明map中,存在该元素
int num = map.get(arr[i]);
map.put(arr[i], ++num);
}
}
System.out.println("统计单词出现的个数,结果如下:");
Set<String> set = map.keySet();
for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
String key = iterator.next();
Integer value = map.get(key);
System.out.println(key + "=" + value);
}
}
}
如有谬误或不完善之处,恳请斧正!