集合
  • List系列集合:有序,可重复,有索引
  • Set系列集合:无序,不重复,无索引

Collection

  • contains对象一定要重写equals方法

Collection遍历方式

  • 迭代器遍历: Iterator

  • 迭代器遍历完毕,指针不会复位

  • 迭代器遍历时,不能用集合的方法进行增加或删除

  • 增强for遍历:底层为Iterator迭代器

  • lambda表达式遍历: forEach()方法

List集合

  • 遍历方式

ArrayList底层原理

  • 利用空参创建的集合,在底层创建一个默认长度为0的数组
  • 添加第一个元素时,底层会创建一个新的长度为10的数组
  • 存满时,会扩充为1.5倍
  • 如果一次添加多个元素,1.5倍还放不下,则创建数组的长度以实际为准

LinkedList底层原理

  • 双向链表,查询慢,增删快
  • 多个首尾元素API

泛型

  • 泛型类

  • 泛型方法: 方法中形参类型不确定时,使用类名后面定义的泛型;在方法声明上加上自己的泛型;

  • 泛型接口:实现类给出具体的泛型;实现类延续泛型

  • 泛型不具备继承,通配符:?,有两种用法:? extends E; ? super E: 可以限定类型的范围

  • 度:每个节点的子节点数量
  • 树高:树的总层数

二叉查找树

  • 每个节点至多有两个子节点
  • 任意节点的左子树一定小于该节点
  • 任意节点的右子树一定大于该节点
  • 遍历方式:前序:根左右,中序:左根右,后序:左右根,层次:一层一层遍历

平衡二叉树

  • 任意节点左右子树高度差不超过1
  • 左旋:以不平衡点为支点,把支点左旋降级,变成左子节点,并晋升原来的右子节点;原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点
  • 右旋:以不平衡的点作为支点,把支点右旋降级,变成右子节点,晋升原来的左子节点;原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点
  • 左左:一次右旋;左右:先局部左旋,后整体右旋;右右:一次左旋;右左:先局部右旋,后整体左旋

红黑树

  • 一种特殊的二叉查找树,每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过”红黑规则”进行实现的
  • 红黑规则:每一个节点或是红色的,或者是黑色的;根节点必须是黑色;如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况);对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
  • 添加的节点默认是红色(效率高)

Set集合

  • set实现类的特点:HashSet:无序、不重复、无索引;LinkedHashSet:有序、不重复、无索引;TreeSet:可排序、不重复、无索引;

HashSet底层原理

  • HashSet集合底层采取哈希表存储数据
  • 哈希表是一种对于增删改查数据性能都较好的结构 JDK8以前:数组+链表;JDK8以后:数组+链表+红黑树

哈希值

  • 根据hashCode方法算出来的int类型的整数
  • 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
  • 一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值
  • 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
  • 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
  • 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
  • 当链表长度大于8而且数组长度大于等于64 链表转成红黑树
  • 如果集合中存储的是自定义对象,必须要重写hashCode和equals方法

LinkedHashSet底层原理

  • 有序,不重复,无索引
  • 底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序

TreeSet底层原理

  • 不重复,无索引,可排序
  • 底层:红黑树

Map常用API

  • Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
  • Map遍历方式:键找值,获取所有的键,用get方法进行遍历;键值对:entrySet方法;Lambda表达式:forEach()方法

HashMap

  • HashMap是Map里面的一个实现类
  • HashMap跟HashSet底层原理是一模一样的,都是哈希表结构
  • 如果键的值是一样的,就覆盖;否则直接挂在到旧元素下面
  • 当链表长度大于8而且数组长度大于等于64 链表转成红黑树
  • 如果键存储的是自定义对象,需要重写hashCode和equals方法
  • 如果值存储自定义对象,不需要重写hashCode和equals方法

TreeMap

  • 有序,不重复,无索引
  • 用双链表机制记录存储
  • TreeMap跟TreeSet底层原理一样,都是红黑树结构
  • 由键决定特性:不重复、无索引、可排序
  • 可排序:对键进行排序
  • 排序方式:实现Comparable接口,指定比较规则;创建集合时传递Comparator比较器对象,指定比较规则;

不可变集合

  • 不能增删改
  • Map.of最多只能接受10个键值对,ofEntries可以接受多个