千家信息网

常用的Java数据结构知识点有哪些

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,小编给大家分享一下常用的Java数据结构知识点有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. 数据结构分类按照线性和非线性可以将Java数据结构分为两大类:①线性数据结构:
千家信息网最后更新 2025年02月05日常用的Java数据结构知识点有哪些

小编给大家分享一下常用的Java数据结构知识点有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

1. 数据结构分类

按照线性和非线性可以将Java数据结构分为两大类:

①线性数据结构:数组、链表、栈、队列
②非线性数据结构:树、堆、散列表、图

2. 线性数据结构

2.1 数组

数组是一种将元素存储于连续内存空间的数据结构,并且要求元素的类型相同。

// 定义一个数组长度为5的数组arrayint[] 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 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类的子类StackStack 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 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 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(); //输出aqueue.peek(); //输出a

3. 非线性数据结构

3.1 树

树是一种非线性的数据结构,可分为二叉树和多叉树。
二叉树可定义为一个类,该类包含三个成员变量:节点值val、左子节点left、右子节点right

class TreeNode {    int val;    TreeNode left;    TreeNode right;    TreeNode(int x){        this.val = x;    }}

二叉树各节点实例化:

// 根节点rootTreeNode 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,其值为1root.left = n2;// 根节点的右子节点为n3,其值为2root.right = n3;// 节点n2的左子节点为n4,其值为3n2.left = n4;// 节点n2的右子节点为n5,其值为4n2.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> edges = new ArrayList<>();// edge[i]表示图的顶点i对应的边集合List edge_1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));List edge_2 = new ArrayList<>(Arrays.asList(0, 3));List edge_3 = new ArrayList<>(Arrays.asList(0, 4));List edge_4 = new ArrayList<>(Arrays.asList(0, 1, 4));List 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 dict = new HashMap<>();

添加键 - 值对:

dict.put("python", 101);dict.put("c", 102);dict.put("java", 103);

通过键 key查找对应的值 value:

dict.get("python");    // 101dict.get("c");        // 102dict.get("java");    // 103

设计一个简单的Hash函数构建 编程语言 ==> 编号 的映射,构建一个散列表(假设不考虑低碰撞率、高鲁棒性):

String[] program_lang = {"python", "c", "java"};int hash(int idx){    int index = (idx -1 % 100);    return index;}names[hash(101)];    // pythonnames[hash(101)];    // cnames[hash(101)];    // java

3.4 堆

  • (1)堆是一种基于完全二叉树的数据结构,可由数组实现。

  • 完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1 ≤ i ≤ n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

  • (2)基于堆的原理实现的排序算法称为堆排序。

  • (3)基于堆实现的数据结构称为优先队列。

  • (4)堆分为大顶堆、小顶堆:①大顶堆:任意节点的值不大于其父节点的值,即根节点最大,任意子节点小于等于父节点。②小顶堆:任意节点的值不小于其父节点的值,即根节点最小,任意子节点大于等于父节点。

// 初始化小顶堆,操作为 优先队列Queue heap = new PriorityQueue<>();

元素入堆add():

// 元素入堆heap.add(0);heap.add(4);heap.add(2);heap.add(6);heap.add(8);

元素出堆 poll():

// 元素出堆(从小到大)heap.poll(); // -> 0heap.poll(); // -> 2heap.poll(); // -> 4heap.poll(); // -> 6heap.poll(); // -> 8

看完了这篇文章,相信你对"常用的Java数据结构知识点有哪些"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

节点 元素 数据 数据结构 结构 数组 顶点 存储 队列 非线性 方法 矩阵 结点 可变 知识 之间 函数 实例 指向 线性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 大数据网络安全公司排名 软件开发行业有哪些法律法规 株洲嵌入式软件开发 崩三不同服务器可以一起玩吗 3d软件开发需要学什么软件 小米电脑网络安全 表格体现数据库的什么关系 最新的网络安全方面的新闻 东西湖区电商网络安全维护资费 税务网络安全的探索与思考 越南网络安全性 网络技术师范大学有哪些 可做数据库的软件 计算机网络技术手册 数据库中如何将一个表复制 赤壁为什么要维护网络安全 英雄联盟怎么去别的国家服务器 云服务器的到底是干什么的 南昌软件开发哪个好 健康 没数据库 黑龙江大学网络安全比赛 数据库字段缺失 兴化个性化网络技术价格表格 3d软件开发需要学什么软件 我的世界有服务器地址 郑州web前端软件开发靠谱吗 王牌战争怎样创造服务器教程 校园网设计网络安全协议 数据库查询满足多个查询条件 电子技术是不是网络技术
0