Java的数据结构(面试常问)

Java中的数据结构可以分为线性结构和非线性结构。以下是详细介绍:

1.线性结构

包括数组、链表、队列和栈。 还有散列表。

数组是一种线性数据结构,它由相同类型的元素组成,这些元素在内存中连续存储,数组提供了快速访问元素的能力,但长度固定,不便于动态扩容。

链表也是一种线性数据结构,但它不要求元素在内存中是连续存储的,链表的插入和删除操作比数组简单,因为它不需要知道元素的确切位置,但访问特定位置的元素会比较困难。

队列和栈是操作受限的线性数据结构,队列只允许在一端插入元素,在另一端删除元素,而栈只允许在顶端进行插入和删除操作。

3.散列表(哈希表):

也叫哈希表,是根据键和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。它利用数组支持按照下标访问的特性,所以散列表其实是数组的一种扩展,由数组演化而来。

散列表首先需要根据key来计算数据存储的位置,也就是数组索引的下标;

HashValue=hash(key)

散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。

在散列表中,左边是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。

数据结构 优点 缺点
数组 查找快 增删慢
链表 增删快 查找慢
哈希表 增删、查找都快 数据散列,对存储空间有浪费
二叉树 增删、查找都快 删除算法复杂
红黑树 增删、查找都快 算法复杂

表是一种线性数据结构,通常用于存储具有相同类型元素的数据集合,这些元素在表中按行和列组织。

2.非线性结构

包括树、图

树是一种数据结构,其中每个节点最多有一个父节点,可以有多个子节点。图是由节点和连接这些节点的边组成的,其中节点可以是数据元素,边则表示元素之间的关系。

特别说明:

3.B树(多叉树)

平衡多路查找树(查找路径不只两个),不同于常见的二叉树,它是一种多叉树。O(logN)

4.B+树:

是一种自平衡树数据结构,它保持数据排序;在进行搜索、顺序访问、插入和删除的复杂度是O(log n)且B+树只在叶子节点中存放数据,所以消除了一些B树的缺陷。非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中。O(nlogn)

4.1 B+树查找

树的高度低,支持范围查找。

4.2 mysql为什么采用B+树

  1)磁盘IO的次数更少

  2)支持范围查找

4.3 B树与B+树的区别

  1)B+树所有数据都存在叶子节点

  2)B+树的叶子节点有双向指针,方便范围查找,且叶节点上的数据从小到大顺序连接。

5.mysql底层数据结构:B+树

1)索引的最左前缀原则:mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先。

2)explain(sql执行计划):避免全表扫描,尽量走索引。

  type: system > const > eq_ref > ref > range(范围) > index(索引) > all (性能好--->差)

在Java中,这些数据结构可以通过标准库类如ArrayList、LinkedList、Stack和Queue等来实现。例如,ArrayList是基于数组实现的动态大小的列表,LinkedList是基于链表实现的提供了高效的插入和删除操作,而Stack和Queue分别基于栈和队列的逻辑实现。

相关推荐
benchmark_cc4 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
阿维的博客日记5 小时前
MultipartFile 是不是表示仅仅是一个分片?
java·后端·spring·multipartfile
程序员无隅5 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
Python+996 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
二炮手亮子6 小时前
浅记java线程池
java·开发语言
一路向北North6 小时前
Spring Security OAuth2.0(23):分布式系统授权-转发明文给微服务
java·spring·微服务
zmzb01036 小时前
C++课后习题训练记录Day157
开发语言·c++
dunge20266 小时前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
闪电悠米8 小时前
力扣hot100-56.合并区间-排序详解
数据结构·算法·leetcode·贪心算法·排序算法
爱吃牛肉的大老虎8 小时前
rust基础之环境搭建
java·开发语言·rust