八股十问之Java集合ArrayList
文章来源(公众号:八股bro,每天一篇经典面试,更有海量内推职位)
1、ArrayList和LinkedList的区别是什么?
- ArrayList底层数据机构为数组,LinkedList底层数据结构类似链表。
- ArrayList随机查找快O(1), LinkedList随机查找慢O(n)。
- ArrayList增加和删除元素慢,LinkedList增加和删除元素速度快。
2、ArrayList的缩容方式是什么?
ArrayList可以将数组长度缩小至当前元素个数,缩容函数trimToSize()方法,通常不会主动调用。
3、ArrayList的默认构造函数会不会初始化数组的容量?
不会,第一次add元素时候,会初始化数组容量为10。
4、ArrayList(int initialCapacity)的带参构造函数会不会初始化数组的容量?
会,在构造函数为数组开辟initialCapacity大小空间。
5、ArrayList是如何进行扩容的?
- 设定扩容后数组长度为原来的1.5倍。
- 如果新数组长度不能满足容量要求minCapacity,将数组长度扩容至minCapacity大小。
- 如果数组长度超过Integer.MAX_VALUE - 8,将数组长度扩容至Integer.MAX_VALUE大小。
- 将元素拷贝至新数组中,将引用指向新数组地址。
-
6、什么时候扩容1.5倍后,仍然不能满足容量要求?
当使用addAll方法时,新数组扩容1.5倍后容量,仍然不能满足容量要求,会将数组大小直接一次扩容至原数组长度和addAll预添加数组长度之和。
7、ArrayList如何执行向特定index添加元素的add方法?
- 判断index位置是否合法。
- 判断数组容量是否满足,不满足进行扩容操作。
- 将index位置开始,到最后一个位置的所有元素,拷贝到原数组index+1开始的位置。
- 在index位置插入元素。
-
8、在ArrayList中如何移除一个元素?
首先根据索引或者删除元素,找到预删除元素位置,将该位置后面的所有元素向前移动一个位置,并将数组最后一个位置值置为null。
9、ArrayList是线程安全的吗?
ArrayList是线程不安全的。Vector是线程安全的。
10、如何实现线程安全的ArrayList?
- 操作方法用synchronized修饰,SynchronizedList的实现原理。
- 在修改时,复制出一个新数组,修改的操作在新数组中完成,最后将新数组交由array变量指向,CopyOnWriteArrayList实现远离。