首页
编程随笔
Java笔记
Html/Css/Js
Android
后端笔记
服务器搭建
BUG收集
Java异常
Android异常
在线工具
Json格式化
编码/解码
Epub在线编辑
登录
发布文章
个人文章
退出登录
首页
技术教程
BUG收集
在线工具
资源下载
登录
发布文章
退出登录
搜索
当前位置:
首页
-
博客
- 正文
关闭
ArrayList常见面试题
更新时间:2022-03-18 23:28:31
阅读数:726
发布者:落幕
##### 1、ArrayList是什么?可以用来干嘛? ArrayList底层基于数组实现,只能存放对象(底层是Object数组Object[] elementData,所以基本数据类型都会装箱(int->Integer)) ArrayList 允许空值和重复元素 ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引发不可预知的异常或错误。 ##### 2、ArrayList与LinkedList的区别? ArrayList底层是数组实现,LinkedList底层是链表实现。所以ArrayList的查找和访问元素的速度比LinkedList快,ArrayList新增,删除比LinkedList慢 ArrayList需要一份连续的内存空间,LinkedList不需要连续的内存空间(特别地,当创建一个ArrayList集合的时候,连续的内存空间必须要大于等于创建的容量) 两者都是线程不安全的 ##### 3、ArrayList线程不安全解决办法 // 使用下面三个替代 Vector Collections.synchronizedList(new ArrayList<>()); CopyOnWriteArrayList Vector,Collections.synchronizedList()原理都是给方法套个synchronized CopyOnWriteArrayList使用了写时复制,写的时候重新复制数组,然后数组空间加一,复制数组赋值时使用ReentrantLock ##### 4、1.7和1.8版本初始化的区别 JDK1.7 相当于设计模式中的饿汉式 第一次创建无参构造器时就创建一个初始容量为10的数组 JDK1.8 相当于涉及模式中的懒汉式 ArrayList可以通过构造⽅法在初始化的时候指定底层数组的⼤⼩。 通过⽆参构造⽅法的⽅式ArrayList()初始化,则赋值底层数Object[] elementData为⼀个默认空数组 : private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 所以数组容量为0,只有真正对数据进⾏添加add时,才分配默认DEFAULT_CAPACITY = 10的初始容量。