JavaSE进阶——Day05 泛型、数据结构、List集合、Set集合
JavaSE进阶——Day05 该篇主要讲解Java中的泛型、数据结构、List集合和Set集合
泛型
什么是泛型?
是一种或类型参数,可以来设置存储数据类型
泛型解决程序中的什么问题?
限制集和中的数据类型
泛型是使用在代码编写时的一种技术方式(编译期技术)
- 泛型使用后不用再进行数据类型的强转
- 泛型在程序运行后就会擦除
泛型如何使用?
泛型类
当不确定属类中某个属性类型时,可以使用泛型表示
1 | public class 类名<E>{ /* E就是泛型名 */ |
代码:
1 | package io.github.ethanliu6.genericity; |
泛型接口
当不确定接口中某个方法参数使用什么类型或者方法返回值类型时,可以使用泛型表示
1 | public interface 泛型接口<E>{ /* E就是泛型名 */ |
1 | // 情况1:在子类编写时,指定接口上泛型的具体类型 |
泛型方法
当前类没有声明为泛型类,当方法不知道参数类型或者返回值类型时,使用泛型方法
1 | //语法格式 |
1 | public <T> method(<E> param){ |
泛型梳理
1 | 基础泛型的定义: |
泛型通配符
- 泛型通配符:
<?>
(任意类型) - 通常在开发中,
?
与泛型的上下限一起使用
受限泛型
泛型下限:
1 | //指定的泛型中的最小类型 |
泛型上限:
1 | //指定泛型中的最大类型 |
例如:
1 | package io.github.ethanliu6.genericity.demo03; |
数据结构
这里只是简单的学习数据结构,并非408中的系统性数据结构
数据结构的认识
数据结构:数据存储时的一种排列方式
类型:
栈(先进后出)
队列(先进先出)//数组就是这种方式
数组结构:
数组在内存中的体现是一块连续存储数据的空间
特点是查询快、增删元素慢
ArrayList
集合底层就是使用:数组结构
链表
哈希表
树
- 二叉树
- 平衡二叉树
- 红黑树
- ……
栈
队列
树
平衡二叉树
红黑树
List集合
Java语言中集合体系划分:
- Collection (接口)
- Map (接口)
java.util.Collection集合: 是一个接口(无法实例化)
- java.util.List集合(接口)
- 常用子类:ArrayList 、 LinkedList
- java.util.Set集合(接口)
java.util.List集合:
- 带有索引
- 存储的元素的顺序和获取元素的顺序一致
- 可以存储重复元素
因为List集合可以使用索引,故围绕着索引,设计很多API方法:
1 | //添加元素 |
ArrayList集合:
- 实现List接口(List接口中的所有功能都有)
- 底层使用:数组
- 查询快 、 增删慢
链表结构:
在内存中是使用==节点==来存储数据
- 节点 = 数据 + 地址
链表:有头、有尾
- 分类:
- 单向链表:只能从头到尾
- 双向链表:可以从头到尾,也可以从尾到头 (提高查询效率)
- 代表集合类:LinkedList
LinkedList集合:
实现List接口
底层使用:双向链表(有头有尾)
- 增删快 、 查询慢
特有方法都围绕着链表头和尾设计
1
2
3
4
5
6
7
8
9
10
11//添加元素
addFirst( 元素 ) //把元素添加到链表头部
addLast( 元素 ) //把元素添加到链表尾部
//删除元素
removeFirst()
removeLast()
//获取元素
getFirst()
getLast()
Set集合
Collection集合
List集合
- 有索引
- 存取元素有序
- 可能存储重复元素
Set集合
- 没有索引
- 存取元素不保证顺序
- 不允许存储重复元素
Set集合中方法全部来自Collection集合
Set集合的子类:
HashSet集合
特点:
- 没有索引
- 存取元素不保证顺序
- 不能存储重复元素
- 底层使用:哈希表结构
1 | package io.github.ethanliu6.set; |
- LinkedHashSet集合
- TreeSet集合
哈希表数据结构:
底层是使用大小为16的数组+链表组成的存储方式
哈希表存储数据的方式 ( 借助:哈希值[存储位置] )
1
2
3
4
5
6
7
8
9
10
11拿要存储的元素,结合哈希算法, 计算出哈希值(存储位置) // 调用: 元素.hashCode()
判断 : 计算出的存储位置上是否有元素存在
情况1 : 没有元素存在 => 直接存储
情况2 : 已有元素存在
拿要存储的元素 和 已经存在的元素 进行比较(比较内容是否相同) //元素.equals()
相同: (重复元素) => 不存储
不相同: (不重复元素)
再次拿当前存储空间作为算法因子,再次进行哈希算法,计算新的存储空间
从JDK1.8开始,哈希表底层进行优化,使用:数组+链表/红黑树
- 从链表 => 红黑树时机: 当链表的长度>8,自动 把链表转换为红黑树
Set集合:
HashSet
- 底层:哈希表结构
- 特点:
- 不能存储重复元素
- 没有索引
- 存取元素顺序不保证一致
LinkedHashSet
特点:
- 没有索引
- 不能存储重复元素
- 存取元素顺序一致
底层:哈希表+链表(保证存储元素的顺序)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package io.github.ethanliu6.set;
import java.util.LinkedHashSet;
/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/4/20 21:10
* @Project JavaCode_SE_Advance
* @Theme LinkedHashSet
*/
public class LinkedHashSetDemo1 {
//验证: 获取元素顺序
public static void main(String[] args) {
//创建集合对象
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Qiu");
linkedHashSet.add("Ethan");
linkedHashSet.add("Qiu");
linkedHashSet.add("Liu");
for (String s : linkedHashSet) {
System.out.println(s); //有序的
}
}
}
- TreeSet(下一篇文章)