参考b站,整理arraylist常见面试题
目录
前言
一、ArrayList的底层实现原理
二、ArrayList list = new ArrayLsit(10)扩容了几次?
三、数组和集合List之间如何转换?
四、Arrays.asList转为集合后,修改原数组,集合的值改不改变?
五、toArray后,修改原集合,数组改不改变?
六、ArrayList和LinkedList的区别
1.底层结构
2.查找效率
3.内存
4.线程安全
总结
前言
牛马大学生对java常见面试题ArrayList进行日常记录,简单的理解总结,供大家进行参考
一、ArrayList的底层实现原理
ArrayList的底层使用的是动态数组,初始化容量为0,第一次添加数据的时候初始化容量为10,每次扩容为1.5倍扩容,扩容需要拷贝原来数组
添加数据,需要保证数组的长度size+1可以存下一个数据,如果当前已用size+1大于数组的长度,则使用grow方法进行扩容,将元素添加到size位置,返回成功的布尔值
二、ArrayList list = new ArrayLsit(10)扩容了几次?
扩容了0次,他只是声明了一个容量为10的数组
三、数组和集合List之间如何转换?
数组转List集合:Arrays中的方法asList
List集合转数组:toArray方法,参数是初始化长度的数组对象
四、Arrays.asList转为集合后,修改原数组,集合的值改不改变?
改变
五、toArray后,修改原集合,数组改不改变?
不改变
六、ArrayList和LinkedList的区别
1.底层结构
ArrayList底层使用的是动态数组,LinkedList底层使用的是双链表
2.查找效率
查找指定下标:ArrayList的时间复杂度是O(1),LinkedList不支持下表查找
查找随机下标:都需要进行遍历,都是O(n)
新增和删除:ArrayList的尾部增删时间复杂度是O(1),其他是O(n)
LinkedList头尾增删时间复杂度是O(1),其他是O(n)
3.内存
ArrayList内存连续,占用内存少
LinkedList内存不连续,链表存储前后节点的引用,内存消耗大
4.线程安全
他们的线程都不安全,如果想要他们的线程安全,可以使用为局部变量,在局部方法内使用,或者使用collection的synchronizedlist方法进行包装
总结
最基本的常见关于Arraylist的面试题,最简单的语言进行总结