常用的Java数据结构知识点汇总
作者:LeBron?Le 发布时间:2022-09-09 02:26:02
1. 数据结构分类
按照线性和非线性可以将Java数据结构分为两大类:
①线性数据结构:数组、链表、栈、队列
②非线性数据结构:树、堆、散列表、图
2. 线性数据结构
2.1 数组
数组是一种将元素存储于连续内存空间的数据结构,并且要求元素的类型相同。
// 定义一个数组长度为5的数组array
int[] array = new int[5];
// 为数组的元素赋值
array[0] = 4;
array[1] = 3;
array[2] = 2;
array[3] = 1;
array[4] = 0;
直接赋值:
// 一种方式
int[] array = {4, 3, 2, 1, 0};
// 另一种方式
int[] array = new int[]{4, 3, 2, 1, 0};
2.2 可变数组
可变数组是在一般数组的基础上结合扩容机制进行改进的具有灵活长度的数组。
// 定义一个可变数组
List<Integer> changeable_array = new ArrayList<>();
// 向可变数组的尾部添加元素
array.add(4);
array.add(3);
array.add(2);
array.add(1);
array.add(0);
2.3 链表
链表可以定义为一个类,该类的包含两个成员变量的:节点的值val、后继节点的引用next。节点是构成链表的基本单位,这种数据结构在内存空间的存储地址是非连续的。
// 定义链表类
class ListNode {
// 节点的值
int val;
// 后继节点的引用
ListNode next;
ListNode(int x){
this. val = x;
}
}
构建多个链表类的对象,并构建这些节点实例之间的引用指向:
①节点head的节点值为2,其后继节点是值为1的节点n2。
②节点n2的节点值为1,其后继节点是值为0的节点n3。
③该链表的头节点为head,尾节点为n3。
// 实例化节点
ListNode head = new ListNode(2);
ListNode n2 = new ListNode(1);
ListNode n3 = new ListNode(0);
// 构建三个节点之间的引用指向
head.next = n2;
n2.next = n3;
2.4 栈
栈是一种抽象数据结构,特点是“后进先出”,可由数组或者链表实现。
// 定义一个栈,使用Java的Vector类的子类Stack
Stack<Integer> stack = new Stack<>();
入栈操作 push():
// 元素0入栈
stack.push(0);
// 元素1入栈
stack.push(1);
出栈操作 pop():
// 元素1出栈
stack.pop();
// 元素0出栈
stack.pop();
在Java中可以使用Stack、ArrayDeque、LinkedList实现栈,但通常情况下,不推荐使用Vector类以及其子类Stack,
一般使用LinkedList来实现栈:
LinkedList<Integer> stack = new LinkedList<>();
入栈操作 addLast():
// 元素0入栈
stack.addLast(0);
// 元素1入栈
stack.addLast(1);
出栈操作 removeLast():
// 元素1出栈
stack.removeLast();
// 元素0入栈
stack.removeLast();
2.5 队列
队列是一种抽象数据结构,特点是“先进先出”,可由链表实现。LinkedList
类实现了Queue接口,因此可以把LinkedList
当成Queue来用。
Queue<Integer> queue = new LinkedList<>();
入队操作 offer():
// 元素0入队
queue.offer(0);
// 元素1入队
queue.offer(1);
出队操作poll(),该函数的返回值为出队的那个元素:
// 元素0出队
queue.poll();
// 元素1出队
queue.poll();
element():返回第一个元素
peek():返回第一个元素
区别:在队列元素为空的情况下,element()
方法会抛出NoSuchElementException
异常,peek() 方法只会返回 null。
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
queue.element(); //输出a
queue.peek(); //输出a
3. 非线性数据结构
3.1 树
树是一种非线性的数据结构,可分为二叉树和多叉树。
二叉树可定义为一个类,该类包含三个成员变量:节点值val、左子节点left、右子节点right
。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
this.val = x;
}
}
二叉树各节点实例化:
// 根节点root
TreeNode root = new TreeNode(0);
TreeNode n2 = new TreeNode(1);
TreeNode n3 = new TreeNode(2);
TreeNode n4 = new TreeNode(3);
TreeNode n5 = new TreeNode(4);
构建二叉树各节点之间的引用指向:
// 根节点的左子节点为n2,其值为1
root.left = n2;
// 根节点的右子节点为n3,其值为2
root.right = n3;
// 节点n2的左子节点为n4,其值为3
n2.left = n4;
// 节点n2的右子节点为n5,其值为4
n2.right = n5;
3.2 图
图是一种非线性数据结构,由顶点(vertex)和边(edge)组成,每条边都连接着两个顶点。
图分为有向图和无向图。
以无向图为例:
①顶点集合: vertices = {1, 2, 3, 4, 5}
②边集合: edges = {(1, 2), (1, 3), (1, 4), (1, 5), (2, 4), (3, 5), (4, 5)}
(1)图的表示方法:邻接矩阵(无向图的邻接矩阵是一个斜对角对称矩阵)
⭐邻接矩阵适用于存储稠密图,即顶点较多、边较少。
// 存储图的顶点
int[] vertices = {1, 2, 3, 4, 5};
// 存储图的边
int[][] edges = {{0, 1, 1, 1, 1},
{1, 0, 0, 1, 0},
{1, 0, 0, 0, 1},
{1, 1, 0, 0, 1},
{1, 0, 1, 1, 0}};
int[] vertices = {1, 2, 3, 4, 5};
(2)图的表示方法:邻接表
⭐邻接表适用于存储稀疏图,即顶点多、边较少。
// 存储图的顶点
int[] vertices = {1, 2, 3, 4, 5};
// 存储边的集合
List<List<Integer>> edges = new ArrayList<>();
// edge[i]表示图的顶点i对应的边集合
List<Integer> edge_1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
List<Integer> edge_2 = new ArrayList<>(Arrays.asList(0, 3));
List<Integer> edge_3 = new ArrayList<>(Arrays.asList(0, 4));
List<Integer> edge_4 = new ArrayList<>(Arrays.asList(0, 1, 4));
List<Integer> edge_5 = new ArrayList<>(Arrays.asList(0, 2, 3));
edges.add(edge_1);
edges.add(edge_2);
edges.add(edge_3);
edges.add(edge_4);
edges.add(edge_5);
3.3 散列表
散列表是一种非线性的数据结构,实质是将键(key)通过Hash函数完成到值(value)的映射。
// 初始化散列表
Map<String, Integer> dict = new HashMap<>();
添加键 - 值对:
dict.put("python", 101);
dict.put("c", 102);
dict.put("java", 103);
通过键 key查找对应的值 value:
dict.get("python"); // 101
dict.get("c"); // 102
dict.get("java"); // 103
设计一个简单的Hash函数构建 编程语言 ==> 编号 的映射,构建一个散列表(假设不考虑低碰撞率、高鲁棒性):
String[] program_lang = {"python", "c", "java"};
int hash(int idx){
int index = (idx -1 % 100);
return index;
}
names[hash(101)]; // python
names[hash(101)]; // c
names[hash(101)]; // java
3.4 堆
(1)堆是一种基于完全二叉树的数据结构,可由数组实现。
完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1 ≤ i ≤ n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
(2)基于堆的原理实现的排序算法称为堆排序。
(3)基于堆实现的数据结构称为优先队列。
(4)堆分为大顶堆、小顶堆:①大顶堆:任意节点的值不大于其父节点的值,即根节点最大,任意子节点小于等于父节点。②小顶堆:任意节点的值不小于其父节点的值,即根节点最小,任意子节点大于等于父节点。
// 初始化小顶堆,操作为 优先队列
Queue<Integer> heap = new PriorityQueue<>();
元素入堆add():
// 元素入堆
heap.add(0);
heap.add(4);
heap.add(2);
heap.add(6);
heap.add(8);
元素出堆 poll():
// 元素出堆(从小到大)
heap.poll(); // -> 0
heap.poll(); // -> 2
heap.poll(); // -> 4
heap.poll(); // -> 6
heap.poll(); // -> 8
来源:https://blog.csdn.net/hutianle/article/details/123188864


猜你喜欢
- 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 p
- 这篇文章主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可。但是为了保持登录的状态(在各个Activity之间切换
- 在上个星期阿里巴巴一面的时候,最后面试官问我如何把一篇文章中重复出现的词或者句子找出来,当时太紧张,答的不是很好。今天有时间再来亲手实现一遍
- Java游戏俄罗斯方块的实现实例 java小
- 前言我们在日常的开发中有时候会遇到需要用到相机的需求,而相机也是很常用的东西,例如扫二维码啊拍照上传啊等等。这里我不讲像qq那样自定义很强的
- Activiti项目是一项新的基于Apache许可的开源BPM平台,本文就来简述一下Activiti常用类。具体如下:一、为什么要使用工作流
- 主要介绍springboot项目中配置文件的加密前言为了保证服务器相关信息的保密,一般会采用加密的方式进行对配置文件原文的加密,今天介绍下s
- 直接上代码:@Testpublic void testUnicode() { String a = "Hello&qu
- 限流器算法目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法能够强行限制请求速率,平滑突发请求,而令牌桶算法在限定平均速
- 目录面试题1:如何判断对象是否存活1.引用计数算法2.可达性分析算法面试题2:哪些对象可以作为GC Roots?面试题3:你了解的对象引用方
- 我们在应用中经常看到一些选择开关状态的配置文件,做项目的时候用的是android的Switch控件,但是感觉好丑的样子子个人认为还是自定义的
- 本文实例讲述了C#实现char字符数组与字符串相互转换的方法。分享给大家供大家参考,具体如下:一、字符串转换为字符数组char[] temp
- 一.简单介绍1.配置相关的依赖2.配置模式3写.mapper、controller、service4.配置yaml文件 配置mybatis全
- 本文实例为大家分享了Android自定义EditText实现登录界面的具体代码,供大家参考,具体内容如下先看效果图:自定义edittext
- Feign进行调用@FeignClient 找不到通过Feign 进行调用这里配置spring-cloud 版本为 M8的 <
- Lambda,希腊字母λ,在C#编程语言中,被引入为Lambda表达式,表示为匿名函数(匿名方法)。编程时离不开函数,
- 1.UUID 简介UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。也
- 关于MouseWheelListener的鼠标滚轮事件Java中JPanel面板中对鼠标滚轮事件的处理。一、MouseWheelListen
- 前言介绍了几篇 Hero 动画,我们来一个 Hero 动画应用案例。在一些应用中,列表的元素和详情的