温故而知新——Java集合Collection
集合对象有很多,但本质就是“单列集合Collection”和“双列集合Map”
Collection对应的体系结构:
图中红色的线是接口,蓝色线是实现类
学习顶层接口---Collection & 实现类 :
遍历方式:迭代器遍历;增强for遍历;lambda表达式遍历。没有普通的for遍历,因为set系列没有索引
迭代器遍历:
代码及细节
增强for遍历:
!只适用于 数组 或者 单列集合
遍历过程中,不会修改对象内容,比较那个遍历的s,只是第三方变量
lambda表达式遍历:
accept方法接收元素
contains()方法及细节:
对Collection的小结
仅遍历,用增强for或者lambda表达式;遍历,还想修改内容,用迭代器
接口--List常见的方法及5种遍历方法
- List:继承于Collection并新增了以下方法
- get(indexOf):获得索引处元素
- set():重设指定元素值
- indexOf():获取元素索引(位置)
- lastIndexOf():返回元素最后一次出现位置
- subList():截取列表的子列表,需给出起始位置和终止位置
- listIterator():列表迭代器
remove方法:
方法出现重载,会优先调用实参与形参类型相同的方法
因此,如果想要删除元素而非索引处的数据,可以用包装类。
列表迭代器;
对5种遍历方式进行小结
有删除操作,迭代器;有添加操作,特有的迭代器;对索引操作,普通for
ArrayList底层源码分析:
底层是数组;装不下会自动扩容1.5倍;否则就是新的数组长度了
Iterator底层源码分析:
就是对常见的hasNext(),next()方法进行解释、说明
有关泛型的知识
泛型的作用:统一数据类型,避免类型转换的问题
小细节:
编写一个简单的泛型类;
泛型方法:
publicvoid show(){}
09-泛型的通配符和综合练习
- 泛型不可以继承,但数据可以继承:泛型定义时确定了引用对象A,但并不能使用A的子对象B、C等; 但如果使用时确定了数据类型,就可以添加子类对象
- 要求使用一套继承体系,可用?的方法,如下图所示
有 ? extends E ;? super E - 何时使用泛型的通配符呢? 如下图所示
泛型的总结
什么是泛型;泛型的好处;泛型的细节;哪里定义泛型;泛型的使用场景
10-数据结构(二叉树,二叉查找树,平衡二叉树)
讲了一些基本知识点:节点、度、树的深度、左右节点;二叉查找树,左边小,右边大;平衡二叉树是一种特殊的查找树,引出平衡的机制
11数据结构(平衡二叉树旋转机制)
左旋、右旋; 触发时机:添加一个节点时,平衡树不再平衡
左旋的一种复杂现象:
需要左旋的树:
左旋之后的情况:
右旋刚好跟左旋相反
一个简单的情况(左旋也一样):
小结:
12-数据结构(红黑树、红黑规则、添加节点处理方案详解)
红黑树的定义及细节;红黑树与平衡二叉树的比较;红黑树的“红黑规则”:
红黑规则:
- 每个节点要么红,要么黑;
- 根节点必须是黑色的
- 如果一个节点没有子节点(左右都要算)或者(!!)父节点,则这个没有的节点的值为Nil,且是黑色的
- 不能出现2个红色相连的情况
- 对每一个节点,从该节点到所有后代子节点的简单路径 上都有相同数目的黑色节点(即左右两边的黑色节点深度一样)
添加节点的规则:默认添加红色节点,因为效率高(视频中已经展示了)
红黑树的增删改查的性能都很好!(只是左旋、右旋浪费时间罢了,其他都很快)
13-HashSet、LinkedHashSet详解
小结1:set集合的方法跟Collection基本上一致,所以就简单带过。
但重要的是HashSet、LinkedHashSet、TreeSet,各有各的特点
哈希集合 & 哈希值
计算hash值的方面默认在Object类中,根据对象的地址进行计算,不同对象的hash值基本不同;但有小概率发生哈希碰撞,即hash值相同的情况。
一般都是重写hashCode()方法
HashSet底层原理:
加载因子;JDK8及以后的结构:数组+链表+红黑树
HashSet细节:
- JDK8以后,当链表长度超过8,且数组长度>=64时,自动转化为红黑树
- 如果集合中存储的是自定义对象,必须要重写hashCode和equals方法
HashSet 的小结:
Java提供的类一般都重写了hashCode和equals方法
LinkedHashSet的小结:
底层基于哈希表,使用双链表记录添加顺序;一般默认使用HashSet,效率更高
14-TreeSet第一种排序方式超详细讲解
底层基于红黑树,增删查改的性能都比较好
基本用法跟前面的集合都一样,排序规则是继承了Comparable接口,重写了排序规则
15-Tree第二种排序方式和综合练习
比较器排序:创建TreeSet对象时候,比较传递器Comparator指定规则
使用原则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种。
代码演示:
比较字符串:先比较长度;如果长度一样,比较首字母
TreeSet
ts = new TreeSet<>(new Comparator(String o1,String o2)
{
int i = o1.length() - o2.length();
i = i== 0 ?o1.compareTo(o2) : i;
return i;
});
TreeSet总结: