01-数据结构
树结构介绍
-
特点
-
每一个节点有零个或者多个节点
-
没有父节点的节点称之为根节点,一个树最多有一个根节点
-
每一个非根节点有且只有一个父节点
-
二叉树
-
如果树中的每个节点的子节点个数不超过2,那么该树就是一个二叉树
二叉查找树
-
二叉树的特点
-
左子树上所有的节点的值均小于等于他的根节点的值
-
右子树上所有的节点值均大于或者等于他的根节点的值
-
每一个子节点最多有两个子树
-
目的:提高检索数据的性能。
-
-
弊端
-
二叉查找树有可能会出现"瘸子"的现象,影响查询效率。
-
-
网站
平衡二叉树
-
平衡二叉树是在满足查找二叉树的大小规则下,让树尽可能爱笑
-
旋转:
在构建一棵平衡二叉树的过程中 当有新的节点要插入进来以后 我们需要校验新节点的插入是否破坏了树的这种平衡结构, 如果是,则需要对树做调整,以改变树的结构 让其成为一个平衡二叉树;而调整就需要涉及到树的旋转
红黑树
-
核心 :
-
根节点是黑色
-
红色的不能连一起
-
从任意节点开始, 走到叶子节点 , 左右两边的黑色点数, 需要一致
02-Set集合
Set集合特点回忆
-
无序:存取顺序不一致
-
不重复:可以去除重复
-
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
要学习的类
-
HashSet : 无序、不重复、无索引。 【作用 : 元素去重】
-
LinkedHashSet:有序、不重复、无索引。 【作用 : 去重, 还要保证顺序不变】
-
TreeSet:排序、不重复、无索引。 【作用 : 排序】
HashSet底层哈希表
-
介绍:
JDK8之前的,底层使用【数组+链表】组成 JDK8开始后,底层采用【数组+链表+红黑树】组成
1. 根据元素的哈希值跟数组的长度计算出应存入的位置 2. 判断当前位置是否为null, 如果是null直接存入,如果位置不为null,表示有元素 则调用equals方法比较属性值 如果一样,则不存,如果不一样,则存入数组。 3. 当数组存满到16*0.75=12时,就自动扩容, 每次扩容原先的两倍
-
总结
-
HashSet 今后存储的对象, 如果是自定义类型 别忘了重写 hashcode 和 equals 方法
-
LinkedHashSet加入了双向链表
-
在hashSet的基础上加入了双向链表,使集合变得有序
TreeSet红黑树
-
作用
-
对数据排序
-
-
注意
-
如果存储的是自定义对象, 还没有实现过 Comparable 接口
运行的时候, 将会出现 ClassCastException
-
-
排序方式1
-
让类实现 Comparable接口, 重写 compareTo 方法
-
-
排序方式2
-
在构造方法里, 传入Comparator , 重写 compare 方法
-
-
比较规则
两种方式中,关于返回值的规则: 如果认为第一个元素大于第二个元素返回正整数即可。 如果认为第一个元素小于第二个元素返回负整数即可。 如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复。
@Override
public int compareTo(Person o) {
int result = this.age - o.age;
result = this.age == o.age ? this.name.compareTo(o.name) : result;
result = result == 0 ? 1 : result;
return result;
}
//CompareTo方法中this代表传进来的参数,o代表已经传入进来的参数 //拿着this(传进来)的参数和o(已经进来的元素)进行比较,如果this-o是正数则存入树的右边,取出效果就是正序排列 //如果this-o是负数则存入树的左边,取出效果就是倒序排列 //所以想要正序排列或者倒序排列,直接控制o-this 或者 this-o 即可
-
同时指定两种排序方式
-
优先用比较器的排序方式
-
03-Collections
可变参数
-
可变参数指的是,参数的个数可变
如果方法的【参数类型】已经确定,【个数】不确定, 我们可以使用可变参数
-
底层是一个数组实现
-
可变参数是需要三个点,点的数量不允许改变 不要将 ... 写在类型的前面 如果可变参数是方法中的第一个参数,后面将不允许再定义参数,因为接收不到
作用
-
Collections并不属于集合,是用来操作单列集合的工具类。
04-Map集合
介绍
Map集合是一种双列集合,每个元素包含两个数据。 Map集合的每个元素的格式:key=value(键值对元素)。 Map集合也被称为“键值对集合” ------------------------------------- Collection集合的格式: [元素1,元素2,元素3..] Map集合的完整格式: {key1=value1 , key2=value2 , key3=value3 , ...}
场景
-
淘宝购物车,商品可以看成一个key,而数量可以看成value
特点
-
要知道, Map集合中底层的数据结构, 只针对键有效 !!!
-
HashMap : 哈希表, key (键) 是唯一的
-
LinkedHashMap : 哈希表 + 链表 , key (键) 唯一, 有序
-
TreeMap : 红黑树, key (键) 排序
-
常用方法
Map集合的遍历方式
//第一种集合遍历方式,调用key来获取每个对应的value
HashMap<String,String> hm=new HashMap<>();
hm.put("张三","北京");
hm.put("王五","上海");
hm.put("徐毅","北京");
Set<String> s = hm.keySet();
for (String key : s) {
String value = hm.get(key);
System.out.println(key+"----"+value);
}
//第二种集合遍历方式,通过entrySet方法获取集合对象,通过集合对象的getKey/getValue方法获取
Set<Map.Entry<String, String>> en = hm.entrySet();
for (Map.Entry<String, String> et : en) {
System.out.println(et.getKey()+"-----"+et.getValue());
}
//第三种通过foreach方法遍历
hm.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String s, String s2) {
System.out.println(s+"----"+s2);
}
});
HashMap
-
特点以及底层原理
-
由键决定:无序、不重复、无索引。HashMap底层是哈希表结构的。
-
-
依赖hashCode方法和equals方法保证键的唯一。 如果键要存储的是自定义对象,需要重写hashCode和equals方法。 基于哈希表。增删改查的性能都较好。