双列集合

单列集合一次只能添加一个元素
双列集合一次可以添加一对元素(键与值一一对应)

键值对 — Entry 对象

双列集合的特点

Map集合常见API

双列集合添加用put 而不是add

遍历

  1. 键找值
  2. 键值对
  3. lambda表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Map<String,String> map = new HashMap<>();
// 键找值
// 获取所有键 把这些键放到一个单列集合中
Set<String> keys = map.keySet();

for (String key : keys) {
System.out.println(key);
// 利用map集合中的键获取对应的值 get
map.get(key);
}


// 通过键值对进行遍历
// 通过一个方法获取所有的键值对对象 返回一个Set集合
Set<Map.Entry<String, String>> entries = map.entrySet();
// 遍历Entries这个集合 去得到里面的每一个键值对对象
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
}


// lambda 进行遍历
// 底层:
// forEach其实就是利用第二种方式进行遍历 一次得到每一个键值
// 再调用accept方法
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
System.out.println(key + "=" + value);
}
});
// 然后使用lambda 进行简化
map.forEach((String key ,String value)->{
System.out.println(key + "=" + value);
}
);
// 最简lambda表达式的形式
map.forEach((key,value) -> System.out.println(key + "=" + value));

HashMap的底层原理

首先创建长度位16 默认加载因子为0.75的数组
put方法先创建Entry对象 -> 利用键 计算哈希值 得到索引插入
如果位置已经有元素 调用hashcode() 方法计算键的哈希值
如果值是一样的 则覆盖原来索引节点上的Entry对象
如果键不一样则会添加新的Entry对象
JDK8:后

LinkedHashMap

有序

TreeMap

TreeMap自定义排序

1
2
3
4
5
6
7
8
9
10
11
// TreeMap 自定义排序
// Integer Double 默认情况下都是按照升序排列
// String 按照按照字母字典序排序
TreeMap<Integer,String> tm = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// o1: 当前要添加的元素
// o2: 表示已经在红黑树中存在的元素
return o1 - o2;
}
});