站在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,表示进栈和出栈.也就相当于 ...
随机推荐
- Python入门day04_函数与装饰器
一.函数入门 什么是函数: # 函数:函数是一系列代码的集,用来完成特定功能的代码块,类似于工具,可以重复不但的去使用 为什么要有函数: # 优点:# 1. 避免代码的冗余 # 2. 让程序代码结构更 ...
- vue学习笔记(nvm安装)
https://github.com/creationix/nvm https://github.com/coreybutler/nvm-windows 慕课网:https://www.imooc.c ...
- 缓存cache介绍
1. 为何要用缓存.缓存的目的是为了什么?(https://my.oschina.net/u/3378039/blog/2986697) 一个程序的瓶颈在于数据库,内存的速度远远大于硬盘的速度,当我 ...
- python requests库网页爬取小实例:亚马逊商品页面的爬取
由于直接通过requests.get()方法去爬取网页,它的头部信息的user-agent显示的是python-requests/2.21.0,所以亚马逊网站可能会拒绝访问.所以我们要更改访问的头部信 ...
- JS继承(一)
突然发现自己很久没写过什么东西了 其实从博客更新的速度上就可以看出一个人近期有没有成长 对 …… 我没有成长 也可以由此看出自己选择的企业是不是对的 对 …… 我不会离职…… 略略略 来咬我啊…… 于 ...
- Eclipse 中 Maven 项目默认JDK版本为1.5 的解决方法
在 Eclipse 中 Maven project 的默认 JDK 版本是 1.5, 如果不在 settings.xml 或者 pom.xml 中显示的指出 JDK 版本,每次 右键项目--> ...
- 4-2 requests库使用
打开自己的编辑器 创建一个py文件 这里是首先调用requests库 调用requests 最后打印出response
- 关于jquery的选择器中的空格问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ----关于统计字符出现次数的JS循环以及indesxOf函数----
以下将会通过JS循环判断字符“banana”出现次数 以及调用indexOf中的函数来实现统计 <!DOCTYPE html> <html> <body> &l ...
- angularJs $templateCache
模板加载后,AngularJS会将它默认缓存到 $templateCache 服务中.在实际生产中,可以提前将模板缓存到一个定义模板的JavaScript文件中,这样就不需要通过XHR来加载模板了 $ ...