ArrayList与LinkedList连环炮问懵逼

这是从网上查找然后整理的,感觉还不错,如有冒犯请谅解!

说说ArrayList与LinkedList?

ArrayList 的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。LinkedList 的查询效率低,但是增删效率很高,适用于增删动作的比较频繁,查询次数较少的元素管理集合。ArrayList ,LinkedList 都是线程不安全的。

为什么ArrayList查询比LinkedList快?

ArrayList从原理上就是数据结构中的数组,也就是内存中一片连续的空间,这意味着,当我get(index)的时候,我可以根据数组的(首地址+偏移量),直接计算出我想访问的第index个元素在内存中的位置。

LinkedList可以简单理解为数据结构中的链表(说简单理解,因为其实是双向循环链表),在内存中开辟的不是一段连续的空间,而是每个元素有一个 [元素|下一元素地址] 这样的内存结构。当get(index)时,只能从首元素开始,依次获得下一个元素的地址。

用时间复杂度表示的话,ArrayList的get(n)是o(1),而LinkedList是o(n)。

为什么ArrayList增删效率差,LinkedList的增删效率高?

ArrayList是一个可变长数组,插入数据时,则需要先将原始数组中的数据复制到一个新的数组,随后再将数据赋值到新数组的指定位置;删除数据时,也是将原始数组中要保留的数据复制到一个新的数组。

LinkedList是一个由相互引用的节点组成的双向链表,那么当把数据插入至该链表某个位置时,该数据就会被组装成一个新的节点,随后只需改变链表中对应的两个节点之间的引用关系,使它们指向新节点,即可完成插入;同样的道理,删除数据时,只需删除对应节点的引用即可。

因此,在添加或删除数据的时候,ArrayList经常需要复制数据到新的数组,而LinkedList只需改变节点之间的引用关系,这就是LinkedList在添加和删除数据的时候通常比ArrayList要快的原因。

那你说一下什么情况下ArrayList的增删比LinkedList快?(是不是欠打)

当一直往数据中间部分插入删除的时候,ArrayList比LinkedList更快。因为当数据量大的时候,system.arraycopy的效率要比每次插入LinkedList都需要从起始位置查找index和分配节点node来的更快。总之,对于99%或更多的现实情况,ArrayList是更好的选择,并且利用LinkedList的狭隘优势需要非常小心。

说说链表的结构是什么?(心里已经干他了)

链表结构是由许多节点构成的,每个节点都包含两部分:

  1.   数据部分:保存该节点的实际数据。
  2.   地址部分:保存的是下一个节点的地址。

链表的特点:

  1. 结点在存储器中的位置是任意的,即逻辑上相邻的数 据元素在物理上不一定相邻
  2. 访问时只能通过头指针进入链表,并通过每个结点的 指针域向后扫描其余结点,所以寻找第一个结点和最后一 个结点所花费的时间不等

链表的优点:

    数据元素的个数可以自由扩充 、插入、删除等操作不必移动数据,只需 修改链接指针,修改效率较高。

链表的缺点:

    存储密度小 、存取效率不高,必须采用顺序存取,即存 取数据元素时,只能按链表的顺序进行访问 

在进行链表操作时,首先需要定义一个头指针变量(head表示),该指针变量指向链表的第一个节点。

最后一个节点不再指向其他节点(单链表),称为表尾。

添加节点步骤:

  1. 单链表节点添加可以在任意位置插入,且不需要移动数据元素,只需修改链表的指针域即可。插入时间复杂度为O(1)。
  2. 首先分配内存空间,保存新增节点。
  3. 从头指针 head 开始逐个检查,直到找到要插入的位置。
  4. 将插入节点前一个节点指针指向要插入的节点地址,在修改当前节点指针域指向下一个节点地址,把链表连接起来。
  5. 若插入位置为表尾,则把节点指针域置为空(NULL)。

在链表头插入头节点步骤:

    1 .首先分配内存空间,保存新增节点。

    2 .使新增节点指向头指针 head所指向的节点。

    3 .然后使头指针 head指向新增节点。

随机插入节点步骤:

    1 .首先分配内存,保存新增节点。

    2 .找到要插入的逻辑位置,也就是要插入某两个节点之间。

    3 .修改插入位置的节点指针,使其指向新增节点,而使新增节点指向原插入位置所指向的节点

删除节点步骤:

    1 .查找要删除的节点

    2 .使前一节点指向当前节点下一节点

    3 .删除节点

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值