目录
一,数据结构
1.数据结构概述
数据结构(Data Structure) 是计算机存储、组织和管理数据的一种方式,旨在高效地访问和修改数据。它定义了数据之间的逻辑关系、操作规则以及物理存储方式,是算法设计和程序优化的基础。
2.数据结构的作用
-
高效管理数据:通过合理组织数据,减少时间和空间复杂度。
-
简化问题解决:将现实问题抽象为数据模型,便于编程实现。
-
优化资源利用:根据场景选择合适结构,平衡内存占用与操作效率。
3.数据结构的分类
(1)线性结构
-
特点:数据元素按顺序排列,一对一关系。
-
常见类型:
-
数组:连续内存存储,支持快速随机访问。
-
链表:节点通过指针链接,插入/删除高效。
-
栈(Stack):后进先出,用于函数调用、括号匹配。
-
队列(Queue):先进先出,如任务调度、缓冲池。
-
(2)树形结构
-
特点:数据分层或分叉,一对多关系。
-
常见类型:
-
二叉树:每个节点最多两个子节点,支持快速搜索(如二叉搜索树)。
-
堆(Heap):用于优先队列、排序算法(如堆排序)。
-
B树/B+树:数据库索引的核心结构,优化磁盘读写。
-
(3)图结构
-
特点:数据多对多关系,由节点(顶点)和边组成。
-
应用场景:社交网络、路径规划(Dijkstra算法)、推荐系统。
(4)散列结构(哈希表)
-
特点:通过哈希函数直接定位数据,理想情况下操作时间复杂度为O(1)。
-
应用场景:字典、缓存系统(如Redis)、数据去重。
(5)其他特殊结构
-
并查集:处理不相交集合的合并与查询。
-
跳表:链表的多层索引结构,支持高效搜索。
4.总结
数据结构是计算机科学的基石,它决定了程序的效率和可维护性。掌握常见结构(如数组、链表、树、图)的特性和适用场景,是写出高性能代码的关键。学习时建议结合算法(如排序、搜索)实践,深入理解其设计思想。
二,LinkedList集合
1.LinkedList集合的基本概念
LinkedList
是 Java 集合框架中List
接口的实现类之一,基于双向链表数据结构实现,允许存储null
元素,且保留插入顺序。
2.LinkedList 的数据结构特点
- 每个节点包含:
item
:存储的数据元素。prev
:指向前驱节点的引用。next
:指向后继节点的引用。
- 头节点(
first
)和尾节点(last
):链表的起点和终点,便于首尾操作。
3.LinkedList 的常用方法
3.1. 实现 List 接口的方法
方法 | 描述 |
---|---|
add(E e) | 向链表尾部添加元素,返回true |
add(int index, E element) | 在指定索引处插入元素(需遍历链表,效率较低) |
get(int index) | 获取指定索引处的元素(需遍历链表,效率较低) |
set(int index, E element) | 修改指定索引处的元素,返回旧值 |
remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
size() | 返回链表中元素的个数 |
contains(Object o) | 判断链表是否包含指定元素(需遍历链表) |
import java.util.LinkedList;
public class Main2 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aaa");
list.add("bbb");
list.add(1,"ccc");
String r=list.get(2);//返回“bbb”
System.out.println(r);
for (String bookName : list) {
System.out.println(bookName);
}//返回“aaa”,"ccc","bbb"
int a=list.size();
System.out.println(a);//返回3
list.set(2,"ddd");
for (String bookName : list) {
System.out.println(bookName);
}//返回“aaa”,"ccc","ddd"
}
}
3.2. 作为双端队列的方法
-
头部操作:
方法 描述 addFirst(E e)
在头部插入元素 getFirst()
获取头部元素(链表为空时抛异常) peekFirst()
获取头部元素(链表为空时返回 null
)removeFirst()
删除并返回头部元素(链表为空时抛异常) pollFirst()
删除并返回头部元素(链表为空时返回 null
) -
尾部操作:
方法 描述 addLast(E e)
在尾部插入元素(等价于 add(e)
)getLast()
获取尾部元素(链表为空时抛异常) peekLast()
获取尾部元素(链表为空时返回 null
)removeLast()
删除并返回尾部元素(链表为空时抛异常) pollLast()
删除并返回尾部元素(链表为空时返回 null
)
import java.util.LinkedList;
public class Main2 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.addFirst("ddd");//将“ddd”插入头部
System.out.println(list.getFirst());//返回”ddd“
System.out.println(list.removeFirst());//删除ddd并返回“ddd”
}
}
4.LinkedList 的遍历方式
迭代器(Iterator)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String element = it.next();
// 处理元素
}
增强 for 循环
for (String element : list) {
// 处理元素
}
列表迭代器(ListIterator)
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String element = lit.next();
if (element.equals("B")) {
lit.set("C"); // 修改元素
}
}
5.总结
优点 | 缺点 |
---|---|
1. 高效的增删操作(尤其是头尾) | 1. 随机访问效率低(O (n)) |
2. 支持双端队列操作 | 2. 内存占用较高 |
3. 灵活的链表结构 |
三.set系列集合
1.Set 集合的基本概念
- 定义:
Set
是 Java 集合框架中的无序(存储顺序与取出顺序无关)、不允许重复元素的集合接口,主要实现类包括HashSet
、TreeSet
和LinkedHashSet
。 - 核心特性:
- 唯一性:通过
equals()
方法判断元素是否重复,若重复则仅保留一个。 - 无序性:不同实现类对 “无序” 的定义不同(如
HashSet
基于哈希表,无固定顺序;TreeSet
按自然顺序或定制顺序排序)。 - 不支持索引:无法通过索引访问元素,只能通过迭代器或增强 for 循环遍历。
- 唯一性:通过
2.Set 接口的常用方法
方法 | 描述 |
---|---|
boolean add(E e) | 添加元素,若元素已存在则返回false (不执行添加) |
boolean remove(Object o) | 删除指定元素,存在则返回true |
boolean contains(Object o) | 判断是否包含指定元素(通过equals() 比较) |
int size() | 返回集合中元素的个数 |
boolean isEmpty() | 判断集合是否为空 |
Iterator<E> iterator() | 返回迭代器,用于遍历集合元素 |
void clear() | 清空集合所有元素 |
import java.util.HashSet;
public class Main2 {
public static void main(String[] args) {
HashSet<String> set=new HashSet<>();
set.add("aaa");
set.add("bbb");
set.add("ccc");//添加“aaa”,"bbb","ccc"
set.remove("aaa");//删除“aaa”
System.out.println(set.contains("bbb"));//存在“bbb”,返回true
System.out.println(set.size());//返回2
System.out.println(set.isEmpty());//集合中有元素,返回“false”
}
}
3.set集合的遍历
3.1增强 for 循环
Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c"));
for (String element : set) {
System.out.print(element + " "); // 输出顺序不确定(HashSet无序)
}
3.2迭代器遍历
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String element = it.next();
// 处理元素
}
四.HashSet集合
1. 数据结构与原理
- 底层实现:基于哈希表(本质是
HashMap
,元素存储为键,值统一为PRESENT
常量)。 - 唯一性保证:
- 先通过元素的
hashCode()
计算哈希值,确定存储位置(桶)。 - 若桶中无元素,直接存入;若有元素,通过
equals()
比较是否重复,重复则不存储。
- 先通过元素的
- 无序性:元素的存储顺序由哈希值决定,与插入顺序无关。
- 适用场景:需要快速判断元素是否存在(
contains()
时间复杂度接近O(1)
),无序且允许null
的场景。
2.构造方法
HashSet<E> set = new HashSet<>(); // 空集合,默认初始容量16,负载因子0.75
HashSet<E> setWithCapacity = new HashSet<>(initialCapacity); // 指定初始容量
HashSet<E> setFromCollection = new HashSet<>(collection); // 基于现有集合创建
五.TreeSet集合
1. 数据结构与原理
- 底层实现:基于红黑树,元素按自然顺序或定制 Comparator 顺序排序。
- 唯一性保证:通过
compareTo()
(自然顺序)或Comparator.compare()
(定制顺序)判断元素是否相等,若比较结果为 0 则视为重复,不存储。 - 有序性:元素始终按排序规则排列,迭代时按顺序输出。
- 适用场景:需要元素自动排序、范围查询(如
headSet
、tailSet
)的场景。
2. 构造方法
TreeSet<E> set = new TreeSet<>(); // 自然排序(元素需实现Comparable接口)
TreeSet<E> setWithComparator = new TreeSet<>(Comparator comparator); // 定制排序
TreeSet<E> setFromCollection = new TreeSet<>(collection); // 基于现有集合创建(自动排序)
3.TreeSet集合的特殊遍历
TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(3, 1, 2));
// 正序遍历(自然顺序)
for (Integer num : treeSet) {
System.out.print(num + " "); // 输出:1 2 3
}
// 逆序遍历
Iterator<Integer> descendingIt = treeSet.descendingIterator();
while (descendingIt.hasNext()) {
System.out.print(descendingIt.next() + " "); // 输出:3 2 1
}