Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序

文章目录

  • 一、数据结构
    • 1. 栈
    • 2. 队列
    • 3. 数组
    • 4. 链表
    • 5. 红黑数
      • 5.1 树
      • 5.2 二叉数
      • 5.3 排序树
      • 5.4 平衡树
      • 5.5 红黑树
  • 二、List接口
    • 1. 常用方法&遍历方法
  • 三、List实现类
    • 1. ArrayList
    • 2. LinkedList
  • 四、Set实现类
    • 1. HashSet
      • 1.1 HashSet特点
      • 1.2 Hash值
        • 1.2.1 哈希值的注意事项
      • 1.3 哈希表
      • 1.4 集合不允许重复元素的原理
      • 1.5 存储自定义对象
    • 2. LinkedHashed
    • 3. 可变参数
  • 五、Collections
    • 1. 批量添加&打乱
    • 2. sort排序(默认升序)
    • 3. sort(指定排序规则)
    • 4. 组合排序

一、数据结构

本部分只介绍和集合相关的数据结构:栈、队列、数组、链表、红黑树

1. 栈

  • 特点: 先进后出
  • 存储数据: 称为入栈,压栈
  • 取出数据: 称为出栈,弹栈
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第1张图片

2. 队列

  • 特点: 先进先出
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第2张图片

3. 数组

  • 特点: 查询快,增删慢
  • 查询快: 顺序存储,每一部分的地址都可以由数组地址及对应索引根据公式推出。所以,复杂度为 O ( 1 ) O(1) O(1)
  • 增删慢: 增删一个元素,需要进行复制操作,然后源数组被垃圾回收。所以,复杂度为 O ( n ) O(n) O(n)
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第3张图片
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第4张图片
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第5张图片

4. 链表

  • 特点: 查询慢,增删快
  • 查询慢: 链式存储,要确定某一元素内存地址,必须知道它的直接前节点。所以,复杂度为 O ( n ) O(n) O(n)
  • 增删快: 增删一个元素,只要将直接前置节点的指针改变一下即可。所以,复杂度为 O ( 1 ) O(1) O(1)
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第6张图片
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第7张图片
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第8张图片

5. 红黑数

5.1 树

Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第9张图片

5.2 二叉数

分支不能超过两个
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第10张图片

5.3 排序树

在二叉树基础上
左子数小,右子数大
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第11张图片

5.4 平衡树

左孩子数=右孩子数
(当然,不相等就叫不平衡树
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第12张图片

5.5 红黑树

Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第13张图片
特点: 相当于平衡树,查询速度非常快。查询叶子节点的最快与最慢速度之间,不能超过两倍


约束:

  1. 节点可以是红色的,或是黑色的
  2. 根节点是黑色的
  3. 叶子节点(空节点)是黑色的
  4. 每个红色的节点的子节点都是黑色的
  5. 任何一个节点,到其每一个叶子节点的所有路径上的黑色节点数相同

二、List接口

  • 有序
  • 有索引
  • 元素允许重复

1. 常用方法&遍历方法

常用方法:add, get, remove, set
遍历方法:for, Iterator, foreach

注意: 注意不要索引越界异常
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第14张图片

三、List实现类

Vector是单列集合的共同父接口(它是Collection的父接口),它是单列的,有自己特殊的方法。

1. ArrayList

  • 底层: 数组
  • 特点: 此实现不是同步的(异步,多线程)

2. LinkedList

  • 底层: 链表
  • 特点: 此实现不是同步的(异步,多线程)

链表的中间操作的复杂度是 O ( n ) O(n) O(n),二两端是 O ( 1 ) O(1) O(1),所以LinkedList有大量针对头尾的方法
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第15张图片

四、Set实现类

  • 不能存储重复值
  • 没有索引 (不能使用带索引的方法,也不能使用普通的for循环遍历)

1. HashSet

1.1 HashSet特点

  • 底层是哈希表(实际为HashMap),哈希表查询的速度相当快
  • 是一个无序的集合
  • 允许使用null元素
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第16张图片
    从图中,我们可以看出:
  1. 重复的元素,未被存储(但存储时不报错)
  2. 遍历的顺序和存储的顺序不一致

1.2 Hash值

哈希值: 对象的地址值,是一个逻辑地址值(是模拟出来得到地址,不是数据实际存储的物理地址)是一个十进制的整数,由系统随机给出。

Object类中有一个方法,可以得到Hash值,用法: . h a s h C o d e ( ) .hashCode() .hashCode(),返回一个int值
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第17张图片

1.2.1 哈希值的注意事项

  1. toString直接打印引用对象,返回的地址值,就是对哈希值进行了进制转化
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第18张图片
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第19张图片2. 可以重写hashCode()方法,String重写了该方法
    (两个一样的数组,哈希值不同)
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第20张图片
    String重写了hashCode(),所以哈希值会相等。这是由于常量池的原因,如果是用new创建,也是不会相等的。)
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第21张图片
    (有个小彩蛋,重地 & 通话hashCode值相等,这叫哈希冲突

1.3 哈希表

哈希表:

  • JDK1.8之前:
    哈 希 表 = 数 组 + 链 表 哈希表 = 数组 + 链表 =+
  • JDK1.8之后:
    哈 希 表 = 数 组 + 链 表 哈希表 = 数组 + 链表 =+ (链表长度超过八位,就会转为红黑树结构)
    哈 希 表 = 数 组 + 红 黑 树 ( 提 高 查 询 结 构 ) 哈希表 = 数组 + 红黑树(提高查询结构) =+

  • 数组结构: 把元素进行了分组,相同哈希值是一组
  • 链表/红黑树结构: 把相同哈希数值的元素链接到一起

1.4 集合不允许重复元素的原理

  1. add()方法会调用hashCode()方法,计算存储元素的哈希值
  2. 与集合中已有元素的哈希值进行比对,如果有相同的(哈希冲突),进行第3步。没有则存储。
  3. 新存的元素,会调用equals()和冲突的元素进行比较。如果不相同,存储

1.5 存储自定义对象

为了让自定义的类,能够区分重复元素,需要重写hashCode()equal()方法(可以用Alt Insert快速插入)

注: 如果不需要进行区分,就不要使用这两个方法了

Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第22张图片
可以让属性一致的多个对象hashCode一致

2. LinkedHashed

  • 底层: 哈希表(数组 + 链表/红黑树) + 链表
  • 链表: 用来记录顺序的链表

3. 可变参数

可以传递 ( 0 ~ ∞ ) (0 \text{\textasciitilde} \infin) 0~个参数
格式:

限制符 返回值类型 方法名(数据类型... 形参名) {
  // 方法体
}

说明:

  1. 可变参数的底层是一个数组
  2. 在传入时,动态地创建一个数组
    注意事项:
  3. 一个方法的可变列表,只能有一个可变参数
  4. 如果有多个参数,可变参数必须在参数列表的末尾

  • Demo: 计算整数和
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第23张图片

五、Collections

Collections是一个操作集合的工具类,提供了大量的静态方法

1. 批量添加&打乱

  • addAll: 批量添加元素
Collections.addAll(集合名, 参数列表...)

在这里插入图片描述

  • shuffle: 打乱集合中元素
Collections.shuffle(集合名)

在这里插入图片描述

2. sort排序(默认升序)

sort: 按照默认(升序)方法排序,只能用于list,不能用于set
在这里插入图片描述


Comparable里的compareTo方法被重写,才能进行排序(比如下图的String)
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第24张图片


重写compareTo方法(以Person为例):

  1. 实现Comparable接口
    在这里插入图片描述
  2. 重写方法(return 0 认为元素都是相同的)
    Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第25张图片
    升序: 调用 - 参数
    降序: 参数 - 调用

Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第26张图片
在这里插入图片描述

3. sort(指定排序规则)

comparable需要重写方法,相当于自己this和别人o的比较
Comparator相当于找了一个裁判(第三方的规则),进行o1o2的比较


可以使用一个匿名类来指定排序规则
Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第27张图片
在这里插入图片描述
升序: o1 - o2
降序: o2 - o1

4. 组合排序

可以使用if来进行组合排序

Java语言进阶 #集合 #Day14 #数据结构 #List #Set #哈希 #Collections #组合排序_第28张图片

你可能感兴趣的:(java)