189 8069 5689

四、ArrayList底层源码详解-创新互联

文章目录
  • 特点
  • 底层源码分析
    • 创建
      • 无参构造器
      • 有参构造器
      • 传入集合的有参构造器
    • 扩容
    • 注意new ArrayList(0)

菜鸟教程ArrayList讲解

成都创新互联于2013年创立,是专业互联网技术服务公司,拥有项目成都网站设计、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元江津做网站,已为上家服务,为江津各地企业和个人服务,联系电话:18980820575特点
  • 可以加入控制null(可加入多个)
  • 底层是数组实现的
  • ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码(没有synchronized),在多线程情况下,不建议使用ArrayList
  • ArrayList中维护了一个0bject类型的数组elementData
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
  • 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
底层源码分析 创建 无参构造器

ArrayList list = new ArrayList();底层的实现方式
在这里插入图片描述

有参构造器

ArrayList list = new ArrayList(8);底层实现
在这里插入图片描述

传入集合的有参构造器

在这里插入图片描述

  • elementData = c.toArray():将c对象转换成数组赋值给elementData
  • 然后判断内容是否为空,为空的话就直接赋值一个空数组
  • 不为空的话需要判断elementData是不是一个Object[].class,(因为c.toArray()是转换成数组赋值给elementData,而elementData里面添加的元素都是以Object[].class添加进去的),所以如果不是Object[].class类就转换成Object[].class类。

也就说明,无参构造器,一开始得到的集合是空的

扩容

list.add(new Book(“红楼梦”,30,“曹雪芹”));底层的实现

  1. 首先走到这里在这里插入图片描述

    • E e:表示添加数据时传进来的数据
    • ensureCapacityInternal(size + 1):判断是否需要扩容(无参构造器一开始未初始化size,java中默认为0)
    • elementData[size++] = e:add是在最后添加数据
  2. 然后再进入ensureCapacityInternal(size + 1)判断是否需要扩容在这里插入图片描述

  3. 进入calculateCapacity(Object[] elementData, int minCapacity)确定扩容的容量在这里插入图片描述

    • DEFAULTCAPACITY_EMPTY_ELEMENTDATA:空数组
    • DEFAULT_CAPACITY常量10
    • minCapacity:数组添加完这个数据时的容量
  4. 再进入这个方法,确定添加数据

    • modCount:记录添加次数(防止多线程同时修改)
    • if (minCapacity - elementData.length >0):判断当前内容和数组容量大小,如果数组容量够就没必要扩容
  5. 最后才进行扩容在这里插入图片描述

注意new ArrayList(0)

若有参构造时,传的数据是0,那么,扩容还是会按照0扩容,不会按照无参时考虑是否大于10,来扩容。即扩容后elementData数组容量依次为0、newCapacity=1、newCapacity=2、newCapacity=(2+2/2)=3、newCapacity=(3+3/2)=4,newCapacity=(4+4/2)=6,即第六次添加数据不扩容,第七次添加还用扩容…

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:四、ArrayList底层源码详解-创新互联
网页路径:http://cdxtjz.cn/article/cdeego.html

其他资讯