简单分析常用集合的数据结构

在正式开始分析之前我们先说一下数据在计算机中的存储形式,数据在计算机内存中有顺序和链式两种存储结构。简单来说,顺序结构就是把一个一个的数据存储到一段连续的地址空间,数据之间通过物理地址建立关系,可以理解为我们常见的数组。链式存储结构就是把一个一个的数据存储到的计算机内存的任意空闲空间,可以是连续的空间也可以是不连续的空间,数据之间通过指针建立关系。顺序结构和链式结构有他们各自的特点,适用于不同的场景。

        使用顺序结构存储数据需要事先开辟一段指定大小的连续的地址空间(数组),这就要求内存中有足够大的地址块,对内存要求交高,同时使用该方式实现的数据集合都需要处理扩容问题,顺序结构可以通过数组下标索引获取数据,这样在获取和修改指定下标的数据时效率很高。但是对于在非尾部插入数据则需要先把插入位置后面的数据集体后移,为要插入的数据挪出位置,删除亦然,需要把删除位置之后的数据前移,这就是常说的顺序结构增删效率低,改查效率高。

        使用链式结构存储数据不要求内存有足够大的连续空间,也不用事先开辟内存,数据结点之间通过指针相连,如果想获取第i个位置的数据,需要从第一个数据通过指针向后查找,如果想要在第i个位置插入一个元素只需要修改该位置前后结点的指针指向,所以链式结构增删快而改查慢。

        有了以上对数据结构的基本认识就可以开始分析我们用到的各类数据集合了。

ArrayList

ArrayList中的数据是怎么存储的?答案是arraylist用数组封装的线性表,所以它就是一个顺序存储结构的表结构,顺序存储结构的特点它都有。

1.需要事先创建指定大小的数组

Arraylist的创建就是创建一个数组,向ArrayList添加数据就是向数组指定下标赋值

2.非尾部插入和删除数据需要移动后面的数据

我们调用add(data)方法其实就是arr[list.size-1]=data,我们调用add(data,index)其实就是arr[index]=data;对于上图,如果我们想把新数据e添加到下标为1的位置,那么就需要先把index>=1的元素都向后移动再把e赋值到index=1的位置,删除也是同样的道理,删除了index=1的数据需要把后面的数据前移,可以看出ArrayList插入和删除的时间复杂度为O(n)。

3.当list中加入的数据超过数组长度就需要进行扩容,扩容就是新创建一个长度更大的数组,把原数组中的数据copy过去,再将需要加入的数据添加进去,像上图中的数组再添加两个数据就需扩容了。所以如果我们能事先估算出数据规模,可以在创建ArrayList时通过有参构造指定容量大小,避免频繁的扩容以提高效率。

4.可以快速获取和修改指定下标的数据,例如对于上图中的集合我们可以通过调用list.get(0)快速获取数组中的第一个元素a,我们也可以通过set方法快速修改某个下标位置的数据,这类操作时间复杂度为O(1)。

从上面我们可以看出ArrayList的增删改查操作其实就是对数组的操作。

LinkedList

linkedlist是用链式存储结构实现的线性表,所以它具有链式结构的所有特点,java中的LinkedList是一个双向链表,如上图

1.如果我们想在a之后插入一个数据f,我们只需要将f的尾指针指向a的next结点也就是b结点,再将a结点的尾指针指向f,同时由于LinkedList是一个双向链表,我们还需要将f的头指针指向a,b结点的头指针指向f。可以看出LinkedList的插入操作时间复杂度为O(1)

2.查询下标为i的元素需要从头结点一路找下去,例如我们想找index=1的数据,需要从头结点(index=0)通过尾指针才能找到它的next结点(index=1),java的linkedlist在这里做了一个小优化,如果我们要找的数据的下标index小于集合的大小size的一半,即index<size/2就会从头结点开始查找,否则从尾结点开始查找。可以看出linkedlist查找数据的时间复杂度为O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值