八股十问之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实现远离。

文章来源(公众号:八股bro,每天一篇经典面试,更有海量内推职位)
#Java开发##学习路径##春招##实习##面经##Java##校招#
全部评论
谢谢分享 新年快乐
点赞
送花
回复
分享
发布于 2022-02-07 00:23

相关推荐

点赞 10 评论
分享
牛客网
牛客企业服务