大顶锥添加操作
1、入堆新元素,加入到数组末尾(索引位置child)
2、不断比较新加元素和他的父节点(parent)优先级
- 如果父节点优先级高,或 child 为0 为止,
- 如果父节点优先级低,二者交换位置,找到下一个父节点,若child==0,退出循环;
大顶锥删除操作
1、交换堆顶和尾部元素,让尾部元素出队;
2、(下潜)
- 从堆顶开始,将父元素与两个孩子较大者进行交换;
- 直至父元素大于两个孩子,或没有孩子为止;
堆的特点:
对空间内存的占用率比较低;
双列集合的复习:(红框为接口,蓝框为实现类)
-
双列集合的特点:
1、双列集合分为键和值;(键不可以重复,值可以重复)
2、双列集合一次需要储存一对元素,分别为键和值;
3、键和值是一一对应的,每一个键都可以找到自己对应的值
4、键+值这个整体我们称为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”
-
Map集合常用的API
(Map是双列集合的顶层接口,他的功能是全部双列集合都可以继承使用的)
put(k key ,v value) | 添加元素 |
remove(object key) | 根据键删除键值对元素 |
clear() | 移除所有的键值对元素 |
containsKey() | 判断集合是否包括指定的键 |
containsValue() | 判断集合是否包括指定的值 |
isEmpty | 判断集合是否为空 |
size() | 集合的长度,也就是集合中键值对的个数 |
map添加操作及其他操作
Map<String, String> map = new HashMap<>();
//1、添加元素
//put方法的细节
//添加/覆盖
//在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合里
//再添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值给返回
map.put("郭靖","黄蓉");
map.put("韦小宝","沐剑屏");
map.put("伊志平","小龙女");
map的其它方法
//删除
//键存在,将被删除的键值对对象的值返回,不存在该键是返回null
System.out.println(map.remove("re"));
// //clear清空
// map.clear();
System.out.println(map);
//判断是否包括键和值
System.out.println(map.containsKey("小龙女"));
System.out.println(map.containsValue("黄蓉"));
// size()是集合的长度
System.out.println(map.size());
Map的三种遍历方式
1、键找值
Set<String> set = map.keySet();
for (String key : set) {
String value = map.get(key);
System.out.println(key+" ---->"+value);
}
2、键值对
Set<Entry<String, String>> entries = map.entrySet();
for (Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"----->" +entry.getValue());
}
3、Lambda
map.forEach((key, value) -> System.out.println(key + "--->" + value));
HashMap的学习:
1、HashMap是Map里面的一个实现类
2、没有额外需要学习的特有方法,直接使用Map里面的方法就行了
3、特点都是由键决定的(跟值没有关系):无序、不重复、无索引;
4、与HashSet底层原理一样,都是哈希表结构;
HashMap的底层原理:
put 会创建一个Entry对象,然后利用键创建哈希值,跟值无关;
该位置为null,直接加入,键相等,会覆盖原本的Entry对象;链表的长度超过8||数组长度>=64,自动转化为红黑树;
(依靠hashcode和equals方法来保证键的唯一性)
如果键储存的是自定义对象,需要重写hashcode和equals方法,如果值是自定义对象,则不需要重写;
LinkedHashMap的学习:
特点:有序,不重复,无索引;(这里的有序是指保证存储和取出的元素顺序一致)
原理:底层数据结构依然是哈希表,只是每个键值对对元素又额外多了一个双链表的机制记录存储的顺序