Java八股文-List集合

集合的底层是否加锁也就代表是否线程安全

(一)List集合

一、数组

array[1]是如何通过索引找到堆内存中对应的这块数据的呢?

(1)数组如何获取其他元素的地址值
(2)为什么数组的索引是从0开始的,不可以从1开始吗
(3)操作数组的时间复杂度
①查找
  1. 根据索引查询
  2. 未知索引查询
    情况一:

    因为要想在未知索引且未进行排序的情况下去查找数组内的元素就需要去遍历整个数组,所以它的时间复杂度就为O(n)
    情况二:

    数组在经过排序以后就可以使用二分查找法来查找元素,时间复杂度就为O(logn)
②插入、删除
(3)总结

二、ArrayList源码分析

关键方法指的是添加方法与扩容方法

(1)成员变量
(2)构造方法

collection对象是所有单列集合的父接口

(3)关键方法

测试方法:

①第一次添加数据(也就是数组初始化的情况)

ensureCapacityInternal方法用于确保elementData数组的内部容量,calculateCapacity方法用于计算容量,ensureExplicitCapacity方法用于确保明确的容量

②第二至十次添加数据(也就是数组不扩容的情况)

在第二至第十次添加数据时都是直接向数组中插入数据,不需要进行数组扩容

③第十一次添加数据(也就是数组扩容的情况)

三、ArrayList的底层原理及构造函数

(1)底层原理
(2)构造函数

四、如何实现数组和List之间的转换


(1)数组转List集合

运行测试方法:

查看asList方法的源码:

数组通过asList方法传入后在内部创建了一个ArrayList集合,但是它并不是我们平时见到的ArrayList,而是当前Arrays类的一个内部类,并且调用了它的构造方法,将传入的数组赋值给a数组。

说明在该方法中只涉及到了对象的引用,并没有创建新对象,他们两个指向的是同一个地址值。

(2)List集合转数组

运行测试方法:

查看toArray方法的源码:

可以看到在arraycopy方法中将传入的a集合拷贝给了一个新的elementData数组,也就是复制数据到一个新的数组中,所以他们两个是不同的对象。

五、链表

(1)单项链表


①单向链表的时间复杂度分析
  1. 查询操作
  2. 新增\删除操作
(2)双向链表
①双向链表的时间复杂度分析
(3)总结

六、ArrayList和LinkedList的区别



可以使用collections工具类并调用synchronizedList方法来包装集合,这样得到的List集合就是线程安全的,因为它在底层为该集合加上了一个锁,但是性能会下降一些。

总结:

相关推荐
S***26752 小时前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
汤姆yu2 小时前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
Yue丶越2 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
马剑威(威哥爱编程)2 小时前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL2 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
翔云 OCR API2 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
V***u4533 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
这是程序猿3 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
芳草萋萋鹦鹉洲哦3 小时前
【elemen/js】阻塞UI线程导致的开关卡顿如何优化
开发语言·javascript·ui
爱学习的小邓同学3 小时前
C++ --- 多态
开发语言·c++