Java 集合框架 ArrayList 源码剖析

  • 时间:
  • 浏览:1
  • 来源:大发彩神app—大发彩神8苹果版

add()

既然底层是一另另五个数组ArrayList的set()土办法也就变得非常简单,直接对数组的指定位置赋值即可。

将会Java GC自动管理了内存,这里也就非要考虑源数组释放的大疑问。

size(), isEmpty(), get(), set()土办法均能在常数时间内完成,add()土办法的时间开销跟插入位置有关,addAll()土办法的时间开销跟添加元素的个数成正比。其余土办法大后要线性时间。

原文发布时间为:2018-08-06

本文作者:Java杂记

本文来自云栖社区合作协议协议 伙伴“Java杂记”,了解相关信息可非要关注“Java杂记”

addAll()土办法不让 一次添加多个元素,根据位置不同后要另另五个把本,一另另五个是在末尾添加的addAll(Collection c)土办法,一另另五个是从指定位置结束了了插入的addAll(int index, Collection c)土办法。跟add()土办法类似于,在插入后后也都不让 进行空间检查,将会都不让 则自动扩容;将会从指定位置插入,也会存在移动元素的情况。

addAll()的时间复杂性度不仅跟插入元素的有2个有关,也跟插入的位置相关。

ArrayList实现了List接口,是顺序容器,即元素存放的数据与上放的顺序相同,允许上放null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList后要一另另五个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数非要多于当前容量。当向容器中添加元素时,将会容量严重不足,容器会自动增大底层数组的大小。前面将会提过,Java泛型假如编译器提供的语法糖,好多好多 这里的数组是一另另五个Object数组,以便不让 容纳任何类型的对象。

remove()

addAll()

跟C++ 的vector不同,ArrayList这麼 bush_back()土办法,对应的土办法是add(E e),ArrayList也这麼 insert()土办法,对应的土办法是add(int index, E e)。这另另五个土办法后要向容器中添加新元素,这将会会导致 capacity严重不足,假如在添加元素后后,都都不让 进行剩余空间检查,将会都不让 则自动扩容。扩容操作最终是通过grow()土办法完成的。

remove()土办法后要另另五个版本,一另另五个是remove(int index)删除指定位置的元素,假如是remove(Object o)删除第一另另五个满足o.equals(elementData[index])的元素。删除操作是add()操作的逆过程,都不让 将删除点后后的元素向前移动一另另五个位置。都不让 注意的是为了让GC起作用,都不让 显式的为最后一另另五个位置赋null值。

空间的大疑问防止后,插入过程就显得非常简单。

土办法剖析

为追求传输数率,ArrayList这麼 实现同步(synchronized),将会都不让 多个多多线程 并发访问,用户可非要手动同步,也可使用Vector替代。



get()土办法同样很简单,唯一要注意的是将会底层数组是Object[],得到元素后都不让 进行类型转换。

关于Java GC这里都不让 有点硬说明一下,有了垃圾下发器暂且导致 一定不让有内存泄漏。对象可非要被GC的土办法不是还有引用指向它,中间代码中将会不手动赋null值,除非对应的位置被一点元素覆盖,假如假如的对象就一个劲不让被回收。

add(int index, E e)都不让 先对元素进行移动,假如完成插入操作,也就导致 该土办法有着线性的时间复杂性度。



get()

set()