线性存储结构

本文对比了数组(ArrayList)的定长连续特性与链表(LinkedList)的不定长不连续特性,阐述了两者在增删操作和查找效率上的差异,适合查询多于增删的场景。重点介绍了ArrayList的扩容机制和链表的节点操作。
摘要由CSDN通过智能技术生成
①数组结构:
        内存特性:定长且连续
        定长:一个数组在内存中一旦被创建,其长度就是一定的, 不能够被扩展也不能够被缩短 。如果 需要在内存当中将数组的长度进行改变,就需要重新创建一个数组以及将原始数组当中的内容复 制到新数组当中。在Java当中创建对象本身就是一个十分消耗时间和空间的操作,再加上原始元 素的拷贝,将会浪费大量的时间。所以,数组的定长特性导致增删(改变数组长度的增删操作)慢。
        ArrayList当中的数组扩容机制:在ArrayList 内部数组elementData长度不足以容纳新来元素的
情况下,ArrayList会对这个数组进行扩容操作。扩容的时候默认情况下是将数组的长度扩容为
原来的1.5倍。扩容方式是使用位运算符的右移运算,将原始数组长度/2,加上原始数组长度
吗,得到扩容之后的新长度。
        为什么不使用*1.5的方式扩容:1.乘以1.5之后,长度会变成double类型,得到的新长度需要进 行强制类型转换之后才能够使用,这种操作即浪费时间也消耗空间;2.在Java当中,越是接近于 底层的操作,性能越高。和/运算相比,>>运算CPU指令更加简单,所以性能就越高。 结论:定长导致增删慢。
        连续:处于统一数组结构当中的各个元素,其内存地址是连续的。就是因为数组元素内存地址的 连续性,所以我们可以在数组结构当中使用快速随机访问公式,直接计算出目标下标元素的内存 地址,而不是通过一个元素一个元素的遍历得到目标元素的内存地址。
快速随机访问公式: 目标下标元素内存地址 = 数组的首地址(下标位0的元素的内存地址) +
(目标元素下标 * 单个元素大小)。
结论:连续导致查找快。
什么场景下会使用到数组或者通过数组封装的结构:查询多于增删的场景
Java中常见的使用数组进行封装的结构:ArrayList、Vector
②链表结构:
        链表数据类型的定义方式:
        内存特性:不定长且不连续
        不定长:在同一个链表结构当中,每一个数据都是使用一个独立的节点进行保存的。节点与节点
之间使用引用变量(前驱指针、后继指针)进行关联。在对同一个链表结构当中的节点进行增删 操作的时候,只要改变几个引用变量的取值,就能够实现链表节点的增删,不涉及到新链表的整
体开辟和原始链表元素的拷贝。
结论:不定长导致增删快。
        不连续:即使在同一个链表当中的所有节点之间,其内存地址都是不连续的。因为每一个节点都 是单独通过Node节点类型实例化得到的对象。在实例化的过程当中没有办法保证所有的节点之间内存地址具备连续特性。所以在链表结构当中,如果要按照下标进行节点(数据)访问的话,
需要使用计步器法,每一次查找都从头结点出发,一步一步的进行计步,这种操作十分消耗时
间。
结论:不连续导致查找慢。
        双链表的应用:LinkedList、双链表结构既能够从后向前进行查询、也能够从前向后进行查询
补充:链表结构的增删操作: 先后后前
面试题:请比较List接口下两大实现类:ArrayList与LinkedList之间的区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值