JavaSE进阶——Day06 TreeSet、排序查找算法、Map集合、集合嵌套
JavaSE进阶——Day06 该篇主要讲解Java中的TreeSet集合、排序查找算法、Map集合
整体框架
Collection(接口)
.png)
泛型:
1 | //在开发中使用泛型最多的就是:创建集合时使用泛型约束所存储元素的类型 |
Set集合(续)
TreeSet
知识点:
- 具有对所存储元素进行排序的功能
- TreeSet集合存储:String、Interger、Double、Character时,JDK已经默认实现了
java.lang.Comparable
接口(即自带自然排序) - TreeSet集合存储:自定义类型(自己写的)
- 必须保证自定义类型有实现
java.lang.Comparable
接口,并重写CompareTo
方法 - 如果自定义类型未实现该接口,在存储到TreeSet集合中时,会引发异常
- 必须保证自定义类型有实现
compareTo
方法:
1 | //比较大小: 0表示相同 、 负数表示小 正数表示大 |
案例:
1 | package io.github.ethanliu6.set; |
1 | public int compareTo(Student2 student) { |
更换排序方案:
1 | public int compareTo(Student2 student) { |
二叉树
知识点
- 以根节点为坐标,小于根节点的数据存储在左边,大于根节点的数据存储在右边
二叉查找树
- 小左大右
平衡二叉树
树子节点之间的深度差不大于1
使用旋转算法
红黑树
(补充)
比较器
1 | package io.github.ethanliu6.set; |
使用匿名内部类实现比较器
1 | package io.github.ethanliu6.set; |
可变参数
- 可变参数只能放在参数列表最后面
- 可变参数本质就是数组, 所以方法重载上不能够用数组格式写相同的, 如下面的int… 就不能再出现int[]
基本使用
1 | package io.github.ethanliu6.genericity.changeable_param; |
带有泛型的可变参数
例如Collections类
的addAll方法
案例代码:
1 | package io.github.ethanliu6.genericity.changeable_param; |
排序查找算法
冒泡排序
原理:相邻的数据两两比较,小的放前,大的放后
轮次:长度-1
- 每轮:每轮减少一个(已排序/已冒泡的)
代码:
1 | package io.github.ethanliu6.genericity.sort; |
选择排序
原理:拿当前元素与其后面的所有元素进行比较,如果有比当前元素小的,就跟当前元素交换位置,直到所有元素比较完
轮次:长度-1
- 每轮:从当前元素之后一个开始,每轮减少一个即前一轮已排好的
代码:
1 | package io.github.ethanliu6.genericity.sort; |
二分查找
原理:定义头和尾(小—>大),每次选择中值并与头尾比较,中值小换头、大换尾,直到头尾相交
前提:数组元素有序
- 每轮:元素减半
代码:
1 | package io.github.ethanliu6.genericity.sort; |
Map结合
map集合的特点:
- 可以存储两个元素(键值对元素)
- key元素不能重复, value元素允许重复
- 一个key元素只能对应一个value元素(一一对应)//通过key可以找到value
- 存取元素不保证顺序
- 没有索引
java.util.Map(接口)
- HashMap:底层使用哈希表
- LinkedHashMap:底层使用哈希表+链表
- TreeMap:底层使用红黑树
Map集合遍历方式:
Map集合不能直接遍历(只能间接性实现遍历操作)
键找值
- 获取Map集合中所有的key元素,遍历所有的key元素,通过key元素找到对应的value元素
1
Set 存储所有key的Set集合对象 = map集合.keySet();
例:
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
32package io.github.ethanliu6.map;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/4/21 19:11
* @Project JavaCode_SE_Advance
* @Theme 遍历键去找值
*/
public class MapDemo2 {
public static void main(String[] args) {
//创建Map集合对象
Map<String, String> map = new HashMap<>();
//添加集合中的元素
map.put("爱辉", "珠珠");
map.put("小刚", "小卢");
map.put("小谭", "不认识");
map.put("阿子", "没有");
//遍历键去找值
Set<String> keys = map.keySet(); // 获取集合所有key
for (String key : keys) {
System.out.println("Key=" + key + "\t Values=" + map.get(key) /* 键找值 */);
}
}
}
键值对
- 获取Map集合中所有的Map.Entry, 遍历所有的Map.Entry,通过Entry中的API方法获取到key、value
1
2
3
4
5Set<Map.Entry> 存储所有键值对对象的Set集合对象 = map集合.entrySet();
Map.Entry:
Object getKey()
Object getValue()例:
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
33package io.github.ethanliu6.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/4/21 19:11
* @Project JavaCode_SE_Advance
* @Theme 键值对找键值
*/
public class MapDemo3 {
public static void main(String[] args) {
//创建Map集合对象
Map<String, String> map = new HashMap<>();
//添加集合中的元素
map.put("爱辉", "珠珠");
map.put("小刚", "小卢");
map.put("小谭", "不认识");
map.put("阿子", "没有");
//获取所有的键值对对象
Set<Map.Entry<String, String>> set = map.entrySet();
//遍历每个键值对对象并获取键和值
for (Map.Entry<String, String> stringStringEntry : set) {
System.out.println("keys=" + stringStringEntry.getKey() +"\t" +
"values=" + stringStringEntry.getValue());
}
}
}
HashMap存储自定义对象(key)
在Map集合中当key存储的是自定义对象时,要保证对象存储数据的唯一性,需要:自定义对象中重写hashCode、equals方法
例:
1 | package io.github.ethanliu6.map; |
LinkedHashMap集合
- 有序:链表
- 去重:Hash
代码略
TreeMap集合
- 特点:存储的key元素,会按照指定规则排序
- 排序方式:
- 自然排序: 元素自身实现Comparable接口
- 比较器排序:在创建集合对象时,指定比较器(需要重写Comparator接口的compare方法)
- 排序方式:
1 | TreeMap<String,String> map = new TreeMap<>(); //String类要具备自然排序 |
例:
1 | package io.github.ethanliu6.map; |