ArrayList和LinkedList区别是什么

        (涉及代码均是JDK1.8版本下的源码。)

       首先看下ArrayList。

  1. ArrayList继承了List接口,
  2. 底层是数组实现,所以查询指定下标的数据时,效率很好

      3.  添加数据时,默认是直接插入到最后,效率也很快,

     4. 如果插入到指定位置,效率就要跟插入位置之后的数据量有关了,因为涉及到数据的平移复制,其实直接插入数据也不一定效率就高,

此外还要看是否需要扩容,如果需要扩容,也会降低操作效率

     接下来再看LinkedList。

  1. LinkedList继承了List和Deque接口,
  2. 由于实现了Deque接口,所以可以作为双端队列
  3. 底层是链表结构,遍历越靠后的数据花费时间越长,但是,由于底层实现了getFirst()和getLast(),所以链表的头结点和尾节点是一直有记录的,获取链表的第一个元素和最后一个元素可直接调用相应的方法,从而提高获取效率。

   4. LinkedList的新增元素默认也是插入到链表尾部,代码如下:

所以默认插入的效率还是很高的。其实LinkedList指定位置插入元素也很快,因为链表的插入操作会先判断是否是尾节点,是就直接插入到尾部,如果不是就遍历到指定位置然后插入元素即可,时间多花费在遍历上

所以不能单纯的说谁的效率更高,谁更适合增删改,谁更适合查询,要结合具体情况而定。只能说多数情况下,ArrayList更合适随机查找,LinkedList更适合频繁的删除和新增操作,至于时间复杂度每种操作和情况下各有不同。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ArrayListLinkedList都是Java中的集合类,它们的主要区别在于底层数据结构和性质。 ArrayList是基于数组实现的动态数组,它的内部是由一个数组实现的。它支持随机访问,可以在O(1)时间内访问指定位置的元素。但是如果需要在中间插入或删除元素,则需要移动后面的元素,时间复杂度为O(n)。 LinkedList是基于链表实现的双向链表,它的内部是由一个链表实现的。它不支持随机访问,需要从头开始遍历链表找到指定位置的元素。但是如果需要在中间插入或删除元素,则只需要调整前后元素的指针,时间复杂度为O(1)。 因此,ArrayList适用于需要频繁随机访问集合元素的场景,而LinkedList适用于需要频繁插入或删除集合元素的场景。 ### 回答2: ArrayListLinkedList都是Java中的集合类,用于存储和操作元素,但它们有一些不同之处。 首先,ArrayList是基于动态数组实现的,而LinkedList是基于双向链表实现的。这意味着在ArrayList中,元素按照索引进行存储和访问,而在LinkedList中,元素通过节点之间的链接进行存储和访问。 其次,由于底层数据结构不同,ArrayListLinkedList在插入和删除元素时的性能表现有所不同。在ArrayList中,如果需要在中间位置插入或删除元素,需要将后续的元素依次移动,因此时间复杂度为O(n);而LinkedList不需要移动元素,只需要改变节点的链接,因此插入和删除元素的时间复杂度为O(1)。 另外,由于ArrayList是基于数组实现的,它的内存空间是连续分配的,因此可以通过索引进行快速访问。而LinkedList的节点不连续存储,访问元素需要从头节点开始遍历到指定位置,因此访问元素的性能较差。所以,在需要频繁访问元素的情况下,ArrayList的性能更好。 最后,ArrayListLinkedList在内存消耗上也有所不同。由于ArrayList基于动态数组,它的内存消耗是固定的,而LinkedList的内存消耗会随着元素的增加而增加,因为每个元素需要一个节点来存储。 总之,ArrayList适用于需要快速访问元素的场景,而LinkedList适用于频繁插入和删除元素的场景。根据具体的使用情况选择合适的集合类可以提高程序性能。 ### 回答3: ArrayListLinkedList都是Java中常用的集合类,它们的主要区别在于底层的数据结构和性能。 1. 数据结构ArrayList内部使用数组来存储元素,当插入或删除元素时,需要将后面的元素进行移动,因此插入和删除操作效率较低。而查询元素时,ArrayList可以通过索引快速访问元素。 LinkedList使用双向链表来存储元素,每个节点都包含元素本身、前驱节点和后继节点的引用。当插入或删除元素时,只需要修改相应节点的前驱和后继引用,因此插入和删除操作效率较高。但是查询元素时,LinkedList需要遍历链表,因此效率相对较低。 2. 内存占用: ArrayList在内存中分配连续的存储空间,所以每个元素占用的内存是连续的。LinkedList则是通过链表结构存储元素,每个元素可以在内存的不同位置上,因此每个元素占用的内存不一定是连续的。 3. 对于随机访问和顺序访问的效率: ArrayList通过索引可以直接访问指定位置的元素,所以随机访问的效率较高。而LinkedList只能从头开始遍历链表来查找元素,所以顺序访问的效率较高。 综上所述,如果需要频繁进行插入和删除操作,可以选择LinkedList;如果需要频繁进行随机访问操作,可以选择ArrayList。根据具体的使用场景和需求,选择适合的集合类能提高代码的效率和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值