当前位置: 首页 > news >正文

Java,数据结构与集合源码,关于List接口的实现类(ArrayList、Vector、LinkedList)的源码剖析

目录

ArrayList

ArrayList的特点:

ArrayList源码解析:

Vector

Vector的特点:

Vector源码解析:

LinkedList

LinkedList的特点:

LinkedList的源码剖析:

使用说明:


ArrayList

ArrayList的特点:

·实现类List接口,存储有序的、可以重复的数据。
·底层使用Object[ ]数组存储数据。
·线程不安全的。

ArrayList源码解析:

jdk7版本:
ArrayList<String> list = new ArrayList<>();//①
list.add("AA");//②
list .add( "BB" );//③
……
①处在new时,底层初始化了Object类型的数组elementData,初始化长度为10,即Object[ ] elementData = new Object[10];(类似于饿汉式)
②处相当于将elementData数组的元素下标为0的元素赋值为“AA”。即element[0] = "AA";
③处相当于将elementData数组的元素下标为1的元素赋值为“BB”。即element[1] = "BB";
当要添加第11个元素的时候,底层的element数组已满,则需要扩容。默认扩容为原来长度的1.5倍,并将原有数组中的元素复制到新的数组中。
jdk8版本:
ArrayList<String> list = new ArrayList<>();//①
list.add("AA");//②
list .add( "BB" );//③
……
①处在new时,底层初始化了Object类型的数组elementData,即Object[ ] elementData = new Object[ ]{};(类似于懒汉式)
②处首次添加元素时,会初始化数组elementData = new Object[10];   再将elementData数组的元素下标为0的元素赋值为“AA”。即element[0] = "AA";
③处相当于将elementData数组的元素下标为1的元素赋值为“BB”。即element[1] = "BB";
当要添加第11个元素的时候,底层的element数组已满,则需要扩容。默认扩容为原来长度的1.5倍,并将原有数组中的元素复制到新的数组中。

Vector

Vector的特点:

·实现类List接口,存储有序的、可以重复的数据。
·底层使用Object[ ]数组存储数据。
·线程安全的。

Vector源码解析:

(jdk8)
Vector v = new Vector();//①
v.add("AA");//②
v.add("BB");//③
①处在new时,底层初始化了Object类型的数组elementData,初始化长度为10,即Object[ ] elementData = new Object[10];(类似于饿汉式)
②处相当于将elementData数组的元素下标为0的元素赋值为“AA”。即element[0] = "AA";
③处相当于将elementData数组的元素下标为1的元素赋值为“BB”。即element[1] = "BB";
当要添加第11个元素的时候,底层的element数组已满,则需要扩容。默认扩容为原来长度的2倍,并将原有数组中的元素复制到新的数组中。

LinkedList

LinkedList的特点:

·实现类List接口,存储有序的、可以重复的数据。
·底层使用双向链表存储数据。
·线程不安全的。

LinkedList的源码剖析:

(jdk8)
LinkedList<String> list = new LinkedList<>();//①
list.add("AA");//②
list.add("BB");//③
①处并没有什么执行操作
②处将“AA”封装到一个Node对象1中,list对象的属性frist、last都指向此Node对象1。
③处将“BB”封装到一个Node对象2中,Node对象1和Node对象2构成双向链表,同时last指向Node对象2
因为LinkedList使用的是双向链表,不需要考虑扩容问题。

使用说明:

Vector基本不使用。
ArrayList底层使用数组结构,查找和添加操作效率高,时间复杂度为O(1)。删除和插入操作效率低,时间复杂度为O(n)。
LinkedList底层使用双向链表,查找和添加操作效率低,时间复杂度为O(n)。删除和插入操作效率高,时间复杂度为O(1)。
ArrayList除了有空参的构造器,默认底层长度为10之外,还可以传入int类型的值指定底层数组的长度。如果需要的底层数组长度大,又知道大概的数组长度需求,使用此指定底层数组长度的构造器可以避免频繁的新建的数组,让程序效率提高。
http://www.lryc.cn/news/240852.html

相关文章:

  • 算法基础(python版本)
  • 使用Arrays.Sort并定制Comparator排序解决合并区间
  • 【机器学习】039_合理初始化
  • 使用Arrays.asList与不使用的区别
  • 基于可变形卷积和注意力机制的带钢表面缺陷快速检测网络DCAM-Net(论文阅读笔记)
  • el-table 对循环产生的空白列赋默认值
  • 新一代网络监控技术——Telemetry
  • java斗牛,咋金花
  • 深信服技术认证“SCSA-S”划重点:信息收集
  • 代码逻辑修复与其他爬虫ip库的应用
  • 字符串结尾空格比较相关参数BLANK_PAD_MODE(DM8:达梦数据库)
  • 微型计算机原理MOOC题
  • TensorFlow实战教程(十八)-Keras搭建卷积神经网络及CNN原理详解
  • uniapp为什么能支持多端开发?uniapp底层是怎么做的?
  • 《数据仓库入门实践》
  • 什么是arguments对象?
  • Java LinkedList链表、HashSet、HashMap
  • Linux中清除cache/buffer方法
  • github批量仓库克隆,git clone某个用户的所有仓库
  • 防爆智能安全帽、防爆手持终端,防爆智能矿灯守护安全,在煤矿安全生产远程可视化监管中的应用
  • 数据结构与算法【B树】的Java实现+图解
  • 2024中国人民大学计算机考研分析
  • 无人智能货柜:提升购物体验
  • 【OpenCV实现图像:可视化目标检测框】
  • C/C++---------------LeetCode第1436. 旅行终点站
  • 如何在AD上创建完整的项目
  • 实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值
  • 九、ffmpeg命令转封装
  • 数字逻辑电路基础-时序逻辑电路之锁存器
  • Python---global关键字---设置全局变量