温故而知新——Java集合Collection

集合对象有很多,但本质就是“单列集合Collection”和“双列集合Map”

Collection对应的体系结构:

图中红色的线是接口,蓝色线是实现类

学习顶层接口---Collection & 实现类 :
image

遍历方式:迭代器遍历;增强for遍历;lambda表达式遍历。没有普通的for遍历,因为set系列没有索引

迭代器遍历:
代码及细节
image
image

增强for遍历:
!只适用于 数组 或者 单列集合
遍历过程中,不会修改对象内容,比较那个遍历的s,只是第三方变量
image

lambda表达式遍历:
accept方法接收元素
image

contains()方法及细节:
image

对Collection的小结
仅遍历,用增强for或者lambda表达式;遍历,还想修改内容,用迭代器
image

接口--List常见的方法及5种遍历方法

  • List:继承于Collection并新增了以下方法
  • get(indexOf):获得索引处元素
  • set():重设指定元素值
  • indexOf():获取元素索引(位置)
  • lastIndexOf():返回元素最后一次出现位置
  • subList():截取列表的子列表,需给出起始位置和终止位置
  • listIterator():列表迭代器

remove方法:
方法出现重载,会优先调用实参与形参类型相同的方法
因此,如果想要删除元素而非索引处的数据,可以用包装类。
image

列表迭代器;
image

对5种遍历方式进行小结
有删除操作,迭代器;有添加操作,特有的迭代器;对索引操作,普通for
image

ArrayList底层源码分析:
底层是数组;装不下会自动扩容1.5倍;否则就是新的数组长度了
image
image

Iterator底层源码分析:
就是对常见的hasNext(),next()方法进行解释、说明
image

有关泛型的知识
泛型的作用:统一数据类型,避免类型转换的问题
小细节:image

编写一个简单的泛型类;
image

泛型方法:
public void show(){}
image

09-泛型的通配符和综合练习

  1. 泛型不可以继承,但数据可以继承:泛型定义时确定了引用对象A,但并不能使用A的子对象B、C等; 但如果使用时确定了数据类型,就可以添加子类对象
  2. 要求使用一套继承体系,可用?的方法,如下图所示
    有 ? extends E ;? super E
  3. 何时使用泛型的通配符呢? 如下图所示
    image

泛型的总结
什么是泛型;泛型的好处;泛型的细节;哪里定义泛型;泛型的使用场景
image
image

10-数据结构(二叉树,二叉查找树,平衡二叉树)
讲了一些基本知识点:节点、度、树的深度、左右节点;二叉查找树,左边小,右边大;平衡二叉树是一种特殊的查找树,引出平衡的机制

11数据结构(平衡二叉树旋转机制)
左旋、右旋; 触发时机:添加一个节点时,平衡树不再平衡

左旋的一种复杂现象:
需要左旋的树:image
左旋之后的情况:image

右旋刚好跟左旋相反
一个简单的情况(左旋也一样):
image

小结:

12-数据结构(红黑树、红黑规则、添加节点处理方案详解)

红黑树的定义及细节;红黑树与平衡二叉树的比较;红黑树的“红黑规则”:
image

红黑规则:

  1. 每个节点要么红,要么黑;
  2. 根节点必须是黑色的
  3. 如果一个节点没有子节点(左右都要算)或者(!!)父节点,则这个没有的节点的值为Nil,且是黑色的
  4. 不能出现2个红色相连的情况
  5. 对每一个节点,从该节点到所有后代子节点的简单路径 上都有相同数目的黑色节点(即左右两边的黑色节点深度一样)
    image

添加节点的规则:默认添加红色节点,因为效率高(视频中已经展示了)
image

红黑树的增删改查的性能都很好!(只是左旋、右旋浪费时间罢了,其他都很快)

13-HashSet、LinkedHashSet详解

小结1:set集合的方法跟Collection基本上一致,所以就简单带过。
但重要的是HashSet、LinkedHashSet、TreeSet,各有各的特点
image

哈希集合 & 哈希值
计算hash值的方面默认在Object类中,根据对象的地址进行计算,不同对象的hash值基本不同;但有小概率发生哈希碰撞,即hash值相同的情况。
一般都是重写hashCode()方法
image

HashSet底层原理:
加载因子;JDK8及以后的结构:数组+链表+红黑树
image

HashSet细节:

  1. JDK8以后,当链表长度超过8,且数组长度>=64时,自动转化为红黑树
  2. 如果集合中存储的是自定义对象,必须要重写hashCode和equals方法

HashSet 的小结:
Java提供的类一般都重写了hashCode和equals方法
image

LinkedHashSet的小结:
底层基于哈希表,使用双链表记录添加顺序;一般默认使用HashSet,效率更高
image

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;
});
image

TreeSet总结:
image

posted @ 2022-10-21 09:49  aidengduff  阅读(35)  评论(0编辑  收藏  举报