数组
和链表
是数据结构中最基本的部分,也是其他众多数据结构的基础。即便在Java中,这两种结构使用的也很广泛。这里咱们会先对它们进行简要分析。java
在java中,数组定义为一种基本类型,其能够经过下标获取到对应位置的数据。那么这种结构的数据,在内存中是怎么存放的呢?git
正如上图所示,数组在内存中是一段连续的存储单元,每一个数据依次放在每一个单元中。分析这种结构,咱们能够得出如下几个结论:github
建立一个数组,必须声明其长度,以在内存中寻找合适的一段连续存储单元。这也意味着数组的大小是固定的,咱们没法动态调整其大小。编程
想要获取数组中第i个元素,其时间复杂度是 O(1),由于能够根据其地址直接找到它。同理修改也是。数组
数组对查询表现通常,要想查找一个元素,须要遍历,时间复杂度为O(n)。微信
由于地址连续,想要在数组中插入一个元素是复杂的,由于从插入位置起,后边的全部元素都须要向后移动一位。同理删除也是,只是移动方向为向前。而且,当数组存满时,就没法继续插入了。数据结构
由于数组要占据一整块内存,有可能产生许多的碎片,也可能由于找不到合适的内存块,而致使存储失败。源码分析
总结起来就是:数组大小固定,查找迅速,增删复杂,须要完整的内存块,容易产生碎片。post
链表是一种离散存储结构,其在内存中存储不是连续的,每一个数据元素都经过一个指针指向其下一个元素的地址。根据指针域的不一样,链表又分为单链表、双向链表、循环链表等,这里咱们只分析单链表。示意图以下所示: 3d
分析这种结构,咱们能够得出如下几个结论:
声明一个链表时,不须要知道其长度,也不须要连续的内存块,因此其大小能够动态调整。
链表的每一个元素都分为数据域和指针域,前者是实际存储的数据,后者则指向下一个元素的地址。和数组相比,每一个元素须要占用的内存更大了。
要获取链表的第 i 个元素变得复杂,由于其地址存放在它上一个元素的指针域里,因此只能从第一个元素起,进行 i 次操做。同理修改也是。
链表对查询表现也通常,须要遍历,时间复杂度为O(n)。
增长与删除一个元素更方便了,由于没有对内存地址的限制,咱们只须要在对应节点合理处理下指针域的值,就能够把一个元素插入链表或者从链表删除。
链表对内存的要求很小,只要可以存储下一个数据元素的内存块均可以使用,所以不会形成碎片化。
总结起来就是:大小能够动态调整,增删迅速,查找较慢,数据元素所占内存略多,不须要整块内存块,不会形成碎片化。
经过以上分析,数组
和链表
对咱们影响最大的几点区别在于:
在数据量很小,内容基本固定时,咱们选择何种数据结构的影响并不大。但当数据量较大时,若是咱们须要对数据进行频繁的插入删除,咱们应该选择链表,若是咱们须要频繁的获取某个位置的元素,咱们应该选择数组。数组与链表并无明确的优劣之分,根据不一样的使用场景进行不一样的选择,才是这两种结构使用的最佳方式。
上一篇:Java集合源码分析之开篇
本文到此就结束了,若是您喜欢个人文章,能够关注个人微信公众号:大大纸飞机
或者扫描下方二维码直接添加:
您也能够关注个人github:https://github.com/LtLei/articles
编程之路,道阻且长。惟,路漫漫其修远兮,吾将上下而求索。