目录
二十二、HashMap 类
22.1 位置
HashMap 类位于 java.util 包下
22.2 结构
HashMap 类采用哈希表+单链表+红黑树的结构。哈希表用来存储不同位置的元素。单链表和红黑树用来存储哈希表中同一个位置上的多个元素。一开始先用单链表,当单链表的长度大于 8 时转为红黑树结构
22.3 特点
- Key 不可以重复,Value 可以重复
- 若发生了重复的 Key,则后放入的会覆盖先放入的数据。即同一个键若同时加入集合,则后面键对应的值会覆盖前面键对应的值
- 是 Map 接口的实现类
- 元素无序。即存入顺序和取出顺序不一样
- 注意:存储自定义类的时候,自定义类要重写 equals() 和 hashCode() 方法
22.4 构造方法
public HashMap() | |
作用 | 创建一个具有初始容量 16,且加载因子为 0.75 的空的 HashMap 对象 |
public HashMap(int initialCapacity) | |
作用 | 创建一个具有指定初始容量,且加载因子为 0.75 的空的 HashMap 对象 |
public HashMap(int initialCapacity,float loadFactor) | |
作用 | 创建一个具有指定初始容量,且具有指定加载因子的空的 HashMap 对象 |
public HashMap(Map<? extends K,? extends V> m) | |
作用 | 创建一个包含指定集合 m 的 HashMap 对象 |
22.5 常用方法
参考 Map 接口
22.6 小案例:统计输入的各种符号的个数
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入你所想的字符:");
String str = scanner.next();
//原理:利用了 HashMap 的键是唯一的
//同一个键若同时加入集合,后面键的值会覆盖前面键的值
HashMap<Character,Integer> hashMap = new HashMap<Character,Integer>();
for (int i = 0; i < str.length(); i++) {
//一个一个取出 str 中的字符
char c = str.charAt(i);
if (hashMap.containsKey(c)){
//若包含这个键,则取出这个键的值,然后加一
Integer value = hashMap.get(c);
hashMap.put(c,value+1);
}
else {
//若不包含这个键,则初始化
hashMap.put(c,1);
}
}
for (Map.Entry<Character, Integer> characterIntegerEntry : hashMap.entrySet()) {
System.out.println(characterIntegerEntry);
}
}
}
22.7 分析:多层集合
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test02 {
public static void main(String[] args) {
//分析方法:由外层向内层逐渐拆解要定义的变量。再由内向外进行变量赋值
//外层第一层:mapParen
//表示其类型为 Map 类型。而 mapParen 中的每个元素键的类型为 String ,值的类型为 Map
Map<String,Map<String, List<Map<String,Integer>>>> mapParen = new HashMap<>();
//外层第二层即分析 mapParen 变量中元素值的类型。先定义变量 son2
//其类型为 Map 类型。其中每个元素键的类型为 String ,值的类型为 List 类型
Map<String,List<Map<String,Integer>>> son2 = new HashMap<>();
//外层第三层即分析 son2 变量中元素值的类型。先定义变量 son3
//其类型为 List 类型。其中每个元素的类型为 Map 类型
List<Map<String,Integer>> son3 = new ArrayList<>();
//外层第四层
Map<String,Integer> son4 = new HashMap<>();
//赋值
son4.put("小明",25);
son3.add(son4);
son2.put("大明",son3);
mapParen.put("大大明",son2);
System.out.println(mapParen);
}
}