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

一、数据结构

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

1. 栈

  • 特点: 先进后出
  • 存储数据: 称为入栈,压栈
  • 取出数据: 称为出栈,弹栈
    在这里插入图片描述

2. 队列

  • 特点: 先进先出
    在这里插入图片描述

3. 数组

  • 特点: 查询快,增删慢
  • 查询快: 顺序存储,每一部分的地址都可以由数组地址及对应索引根据公式推出。所以,复杂度为O(1)O(1)
  • 增删慢: 增删一个元素,需要进行复制操作,然后源数组被垃圾回收。所以,复杂度为O(n)O(n)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4. 链表

  • 特点: 查询慢,增删快
  • 查询慢: 链式存储,要确定某一元素内存地址,必须知道它的直接前节点。所以,复杂度为O(n)O(n)
  • 增删快: 增删一个元素,只要将直接前置节点的指针改变一下即可。所以,复杂度为O(1)O(1)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5. 红黑数

5.1 树

在这里插入图片描述

5.2 二叉数

分支不能超过两个
在这里插入图片描述

5.3 排序树

在二叉树基础上
左子数小,右子数大
在这里插入图片描述

5.4 平衡树

左孩子数=右孩子数
(当然,不相等就叫不平衡树
在这里插入图片描述

5.5 红黑树

在这里插入图片描述
特点: 相当于平衡树,查询速度非常快。查询叶子节点的最快与最慢速度之间,不能超过两倍


约束:

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

二、List接口

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

1. 常用方法&遍历方法

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

注意: 注意不要索引越界异常
在这里插入图片描述

三、List实现类

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

1. ArrayList

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

2. LinkedList

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

链表的中间操作的复杂度是O(n)O(n),二两端是O(1)O(1),所以LinkedList有大量针对头尾的方法
在这里插入图片描述

四、Set实现类

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

1. HashSet

1.1 HashSet特点

  • 底层是哈希表(实际为HashMap),哈希表查询的速度相当快
  • 是一个无序的集合
  • 允许使用null元素
    在这里插入图片描述
    从图中,我们可以看出:
  1. 重复的元素,未被存储(但存储时不报错)
  2. 遍历的顺序和存储的顺序不一致

1.2 Hash值

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

Object类中有一个方法,可以得到Hash值,用法:.hashCode().hashCode(),返回一个int值
在这里插入图片描述

1.2.1 哈希值的注意事项

  1. toString直接打印引用对象,返回的地址值,就是对哈希值进行了进制转化
    在这里插入图片描述
    在这里插入图片描述2. 可以重写hashCode()方法,String重写了该方法
    (两个一样的数组,哈希值不同)
    在这里插入图片描述
    String重写了hashCode(),所以哈希值会相等。这是由于常量池的原因,如果是用new创建,也是不会相等的。)
    在这里插入图片描述
    (有个小彩蛋,重地 & 通话hashCode值相等,这叫哈希冲突

1.3 哈希表

哈希表:

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

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

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

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

1.5 存储自定义对象

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

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

在这里插入图片描述
可以让属性一致的多个对象hashCode一致

2. LinkedHashed

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

3. 可变参数

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

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

说明:

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

  • Demo: 计算整数和
    在这里插入图片描述

五、Collections

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

1. 批量添加&打乱

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

在这里插入图片描述

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

在这里插入图片描述

2. sort排序(默认升序)

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


Comparable里的compareTo方法被重写,才能进行排序(比如下图的String)
在这里插入图片描述


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

  1. 实现Comparable接口
    在这里插入图片描述
  2. 重写方法(return 0 认为元素都是相同的)
    在这里插入图片描述
    升序: 调用 - 参数
    降序: 参数 - 调用

在这里插入图片描述
在这里插入图片描述

3. sort(指定排序规则)

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


可以使用一个匿名类来指定排序规则
在这里插入图片描述
在这里插入图片描述
升序: o1 - o2
降序: o2 - o1

4. 组合排序

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

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章