JAVA技术分享技术干货Java学习笔记

每日读源码(1)

2016-11-30  本文已影响42人  JUNE言JUNE语

这算是一个新的目标吧,在面试过程中遇到很多需要涉及到源码,所以觉得坚持每天看一点源码。

记得前不久去面了一个Java技术岗,面试官问我知道ArrayList底层是怎么实现的吗,当时我说,我只知道大概底层是用数组实现的,所以查询速度快,但插入跟删除速度慢。

今天就来好好研读一下ArrayList的源代码吧。

首先从类的继承跟实现来看

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

重要需要看的两个
1.继承AbstractList抽象类
2.实现了LIst接口

关于面试中可能会出现的一个问题,ArrayList的默认长度是多少,直接上图

默认长度是10

由于ArrayList的扩容性能应该是比较低的,所以一般比较建议给个比较接近需求的长度进行ArrayList的初始化,这样也可以减少之后扩容带来的性能影响,但是也不能一下子就为了避免扩容而初始化一个过大容量的list,因为这样也会造成内存的浪费。

有参构造函数

可以看到初始化的时候是会new 一个Object的数组。

还有另外一个比较高级的构造函数,是直接使用一个集合类来初始化ArrayList,感觉平时都没怎么用过,孤陋寡闻了啊。

trimToSize

这个方法虽然很少用到,但是我觉得应该还是一个比较重要的一个方法,由于ArrayList底层采用数组实现,然后使用一个size去记录里面有多少个元素,也就导致了数组的大小大于或等于list实际上元素个数。使用该方法可以将多余的空闲空间释放。

每天看一点源代码,幸福生活每一天。

上一篇 下一篇

猜你喜欢

热点阅读