站在JAVA数据结构的视角看待简单表结构
1.前言:
我们提到程序中的集合的时候,往往脑海中会浮现出, 如ArrayList和LinkedList以及和HashMap。当然在提到ArrayList和LinkedList的时候,我们大多数的人都知道一点:ArrayList查询速度快,操作速度慢。LinkedList查询速度慢,但是操作速度快。但是why ? 为什么会是这样的现象? 那么接下我从数据结构角度带大家一起去认识下这个问题。
2.数据结构 --- 线性表
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
上述概念得出:数据结构 = 数据存储 + 数据集合。
线性表: 线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
在数学的角度 线程表A = { A0, A1, A2, ….. , An-1, An, An+1 } ,那么我们称之为 An-1 是 An 的前驱元 ,An+1 是后继元。
3.存储方式
我们简单的认识了线性表的结构 ,那么根据计算机存储不同, 我们将线性表分类成为:线性存储和链式存储。

3.1 线性存储
线性表中线性储存表示我们数据结构在中的元素在存储元素的时候是按照顺序在计算机内存中存储。 典型代表:ArrayList
线性存储的设计数据结构需要包含以下:
I. 起始位置
II. 数组
III. 表空间元素存储位置
从上面我们可以看的出来,我们在设计线程表的时候是通过数组的形式来维护的数据结构的关系,不需要我们自行设计逻辑关系的维护。
数组在维护逻辑关系上来说,由于数组本身包含记录着元素索引。索引搜索起来的速度较快。
缺点:
由于是由数组维护数据结构,会产生一些问题?
第一. 在实现元素的添加的时候,涉及的一个问题就是数组的自动扩容策略。
顺序存储的线性链表在选择自动扩容的测试就是数组的拷贝。
参考ArrayList;源码分析 元素添加方法

其中自动扩容选择了Arrays.copyOf(elementData, newCapacity) 数组的拷贝实现。
那么数组在拷贝的时候,就是涉及到 数据结构中的元素的大量的拷贝迁移

从图一到图二的过度,是我们线性表的自动扩容的过程,涉及到的步骤有数组的新建和元素的拷贝,这样就额外的增加了性能开销。
第二. 空间碎片问题
我们在使用数组开辟内存空间, 但是当我们并没有使用完数组的开辟的空间时候,那么剩余未被使用的空间就会被一直占用不能被释放出来,造成了空间的浪费,这称之为空间碎片

3.2 链式存储
线性表中链式存储存表示我们数据结构在中的元素在存储元素的时候是随机存放在计算机内存中可用的区域存储。这样可以更好的利用内存空间 。典型代表LinkedList
链式存储的线性表结构:设计时不使用数组来维护元素的逻辑关系,需要我们设计节点来描述数据结构中的元素关系。
节点之间需要我们去维护 “ 邻居关系”, 使用任意一组存储单元存储元素,线性表之间的线性逻辑关系是通过这组存储单元中的指针域去指向下一组存储单元,下一组储存单元可以放在任意位置。

参考LinkedList源码:

那么通过上面的数据结构我们可以看出,链式存储的线性表的逻辑关系是通过指针域存储逻辑关系,所以内存上的分布是逻辑上的关联,而物理上是分离的。
这样设计的好处在于,提升了内存的使用效率,避免了空间碎片问题。逻辑关系可以自行维护。那么在实现添加或者删除逻辑操作会更加高效。
今天主要带领大家从数据结构的视角认识我们的简单表结构。 学会了吗? 不一样的角度认识我们的老朋友 ArrayList和LinkedList。接下来还有更多java后端相关知识奉上,请多多关注上海尚学堂JAVA培训,期待下次见面。
站在JAVA数据结构的视角看待简单表结构的更多相关文章
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- 自己动手实现java数据结构(九) 跳表
1. 跳表介绍 在之前关于数据结构的博客中已经介绍过两种最基础的数据结构:基于连续内存空间的向量(线性表)和基于链式节点结构的链表. 有序的向量可以通过二分查找以logn对数复杂度完成随机查找,但由于 ...
- 【Java数据结构与算法】简单排序、二分查找和异或运算
简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个 ...
- Java数据结构——树的三种存储结构
(转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...
- Java数据结构与算法(1):线性表
线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表 ...
- 一文掌握关于Java数据结构所有知识点(欢迎一起完善)
在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- Java数据结构和算法 - 简单排序
Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...
- 数据结构笔记--栈的总结及java数组实现简单栈结构
杂谈"栈"结构: 栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于 ...
随机推荐
- 1-蓝桥杯套路-java
决定参加蓝桥杯用java了,当然得重新刷点题目,熟悉一下,以后要是考研失败了,可能回去找java的工作!!! 经验贴: 1. https://blog.csdn.net/wqy20140101/art ...
- WebSocket 实现链接 群聊(low low low 版本)
py 文件: """ 下载 gevent-websocket 0.10.1 基于Flask + geventWebSocket 建立连接,发送消息,实现群消息功能. &q ...
- functools 之 partial(偏函数)
当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单.当然,decorator(装饰器) 也可以实现, ...
- abap 常用TCODE
ABAP: 通过查询表TSTC或者TSTCT:SAP系统将所有的事务代码都存储在这个表中,包括字开发的Y*和Z* TCODE 事务代码功能描述 CG3Y 下载服务器上文件 CG3Z upload fi ...
- stark组件开发之组合搜索实现思路
- 关键字搜索. 可以做到的效果是, 输入20. 后太通过 Q() 函数. 来实现. 搜索是一个大的问题点. - 要想实现组合搜索, 首先要 明确的一点是. 在我当前的页面上, 正在进行展示的是 ...
- MySQL联接查询算法(NLJ、BNL、BKA、HashJoin)
一.联接过程介绍 为了后面一些测试案例,我们事先创建了两张表,表数据如下: 1 2 3 4 CREATE TABLE t1 (m1 int, n1 char(1)); CREATE TABLE t ...
- Vue添加jquer插件
一.现象 综合开发需要,需要引用使用 二.解决 1.先安装jquer插件,命令运行: npm i jquery --save-dev (tips: i 也就是 install --save-dev ...
- 谷歌搜索技巧(转)https://www.runningcheese.com/google
原文地址: Google是一个非常精密成熟的搜索引擎,其搜索结果的丰富性和准确度较其他搜索引擎都要好,但大多数用户都还只是停留在搜索框中输入一两个关键字,然后点击“搜索”按钮的阶段,这一过程是非常低效 ...
- oracle primary key & foreign key
主键:一个表中只有一个主键约束,但是一个主键约束可以由数据表中的多个列组成:primary key alter table TName add constraints pk_name PRIMARY ...
- Unity打包提示UnityEditor.BuildPlayerWindow+BuildMethodException: Build failed with errors.错误
不要将打包的输出路径设置为Assets文件夹下面即可,MD真坑 老外给出的解释: As you have noticed after you click build settings you are ...