ArrayList和LinkedList的底层实现(存储结构、扩容机制)

Arraylist 底层是数组,以add()方法为例,创建集合对象时候,会首先创建长度为10的数组,一旦添加的数据个数超过了底层数组的长度10 ,就会考虑扩容。默认的扩容长度为原来的1.5倍,同时将原来的数组在中的数据复制到新的数组中

LinkedList:底层是Node双向链表的结构,添加数据时候,元素会封装在Node 对象中,并且指向前面和后面的元素。因为底层不是数组,所以LinkedList没有添加数据需要扩容的问题

### 回答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: ArrayListLinkedList是Java中常用的两种数据结构,它们分别采用了不同的底层实现方式。 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值