Arraylist和Linkedlist的底层结构——数组和链表

Arraylist的底层数据是数组。

 查询数据时可以通过下标定位,所以查询任意数据时所花费的时间是相同的。

但是当删除数据时,将数据删除后需要将后面的元素前移动。添加数据时元素不仅要后移还会涉及到数组的动态扩容操作,效率相对低下。

链表是由许多个结点组合而成的容器。

如图所示,我把数据a储存在了地址为10的结点中,由于此时并未与其他结点相连形成链表,所以在下个结点地址的位置填上^,表示为空。

 再存入一个数据b在地址为20的结点中

 此时我们需要将这个两个结点相连,以便把两个数据储存在同一链表里,需要将数据a的下个结点地址改为数据b的结点地址。

如果要增加或删除某个数据,只需在增加或删除结点后更改结点地址就行。

增加一个储存在结点地址为30的数据c在结点a与b之间:

只需将 a的下一结点地址改为c的结点地址,c的下一结点地址改为b的结点地址。

 可以理解为只要两两结点保持首尾地址一致就行。

由此可见,链表的数据增删只需更改结点地址,比起数组要方便得多,但是正因为这种链式结构,导致了链表没有了下标索引,查询数据时,只能从第一个结点开始依次往下查询,十分耗时。

所以在实际应用中我们要分析客户的需求,偏向于存储大量数据的项目,就应该使用底层结构为链表的Linkedlist集合来创建对象。偏向于存储快速查询数据的项目,就应该用底层结构为数组的的Arraylist集合来创建对象。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ArrayListLinkedList都是Java中的集合类,用于存储一组对象。它们的底层实现不同。 ArrayList底层是一个数组,当数组容量不足时,会自动扩容。因此,ArrayList适用于随机访问元素,但不适用于频繁插入或删除元素。 LinkedList底层是一个双向链表,每个节点都包含前驱节点和后继节点的引用。因此,LinkedList适用于频繁插入或删除元素,但不适用于随机访问元素。 总的来说,如果需要频繁插入或删除元素,建议使用LinkedList;如果需要随机访问元素,建议使用ArrayList。 ### 回答2: ArrayListLinkedList都是Java的集合框架中的常见的两种容器,用于存储一组对象。二者底层实现不同,在功能与表现上各有不同,下面详细介绍各自的底层实现原理。 ArrayList是一个基于动态数组实现的容器类,底层基于数组实现,存放元素的位置是连续的,它实现了List接口,并且允许有重复元素。 在ArrayList底层实现中,它通过一个Object类型的数组来存储元素,当数组不能满足元素的需求时,ArrayList会扩容,即先利用Arrays.copyOf()将旧数组复制到一个新的更大的数组中,再将新元素插入到数组末尾。 LinkedList则是通过双向链表实现的容器,通过节点来存储元素,它实现了List接口、Deque接口以及Queue接口,并且同样允许有重复元素。 在LinkedList底层实现中,它不像ArrayList那样需要实现扩容,因为它并没有与元素数量相关的容量限制。由于它是双向链表实现,所以在插入、删除操作时速度比较快。此外,LinkedList还实现了Queue接口和Deque接口的操作,也就是说可以支持先进先出FIFO队列和两端操作的double-ended queue,比如addFirst、addLast、removeFirst、removeLast等操作。 虽然ArrayListLinkedList底层实现机制不同,但它们在使用中的表现却有很大的相似之处,比如都可以进行元素的添加、删除、获取等基本操作,都可以实现迭代、基于元素的操作和传递函数式接口等高级特性。根据具体需求,需要选择合适的容器才能发挥其优势和性能。 ### 回答3: ArrayListLinkedListJava中常用的两种数据结构,它们分别采用了不同的底层实现方式。 1. ArrayList ArrayList底层实现是基于数组的,它在内存中维护了一个Object[]数组,用来存储数据。在进行增删改查等操作时,都会涉及到数据的移动和重新分配内存空间。 当ArrayList的大小小于等于数组长度时,操作的时间复杂度为O(1);当大小大于数组长度时,时间复杂度为O(n)。因此,在大量操作时,效率相对较低,但在查询操作时效率比较高。 ArrayList的优点是:随机访问元素时效率较高,内存连续、访问速度快。 2. LinkedList LinkedList底层实现是基于链表的,每个元素存储了指向前一个元素和后一个元素的指针。LinkedList没有像ArrayList那样预分配内存空间,而是在添加元素时动态分配空间。 在进行增加或删除元素操作时,由于只需要改变相邻元素的引用关系,而不需要像ArrayList那样进行大规模数据的移动和重新分配内存空间,因此时间复杂度为O(1)。但是,在查询操作时,需要遍历整个链表,时间复杂度为O(n),效率相对较低。 LinkedList的优点是:插入和删除元素时效率较高,内存不连续,占用内存少,在频繁插入和删除元素的情况下效率更高。 综上所述,选择ArrayList还是LinkedList应根据具体情况而定。若需要频繁对元素进行查询和遍历操作,可选择ArrayList;若需要频繁添加或删除元素,可选择LinkedList
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值