Java 集合框架 ArrayList 源码剖析

  • 时间:
  • 浏览:1
  • 来源:5分排列3_5分排列3官网

空间的现象处置后,插入过程就显得非常简单。

get()

get()方式同样很简单,唯一要注意的是可能底层数组是Object[],得到元素后前要进行类型转换。

为追求速度,ArrayList这么实现同步(synchronized),可能前要多个应用应用程序并发访问,用户还前要手动同步,也可使用Vector替代。

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

本文作者:Java杂记

本文来自云栖社区企业媒体合作伙伴“Java杂记”,了解相关信息还前要关注“Java杂记”

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

ArrayList实现了List接口,是顺序容器,即元素存放的数据与倒进去的顺序相同,允许倒进null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有另另另一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不到多于当前容量。当向容器中加在元素时,可能容量缺乏,容器会自动增大底层数组的大小。前面可能提过,Java泛型什么都编译器提供的语法糖,什么都这里的数组是另另另一个Object数组,以便前会 容纳任何类型的对象。

可能Java GC自动管理了内存,这里也就不前要考虑源数组释放的现象。

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

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

set()

关于Java GC这里前要有点痛 说明一下,有了垃圾收集器并非意味一定前会有内存泄漏。对象还前要被GC的方式有无还有引用指向它,上端代码中可能不手动赋null值,除非对应的位置被这些元素覆盖,因此什么都的对象就经常 前会被回收。

add(int index, E e)前要先对元素进行移动,因此完成插入操作,也就意味该方式有着线性的时间比较复杂度。

add()

addAll()方式前会 一次加在多个元素,根据位置不同都有另另另一个把本,另另另一个是在末尾加在的addAll(Collection c)方式,另另另一个是从指定位置现在现在开始插入的addAll(int index, Collection c)方式。跟add()方式类似于,在插入之后 也前要进行空间检查,可能前要则自动扩容;可能从指定位置插入,也会处于移动元素的情况表。

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

跟C++ 的vector不同,ArrayList这么bush_back()方式,对应的方式是add(E e),ArrayList也这么insert()方式,对应的方式是add(int index, E e)。这另另另一个方式都有向容器中加在新元素,这可能会意味capacity缺乏,因此在加在元素之后 ,都前要进行剩余空间检查,可能前要则自动扩容。扩容操作最终是通过grow()方式完成的。



方式剖析



addAll()



remove()