ArrayList集合

一、ArrayList的注意事项

  1. ArrayList集合可以加入null,并且可以加入多个
  2. ArrayList是由数组来实现的数据存储的
  3. ArrayList基本等同于Vetor,但是ArrayList是线程不安全的(执行效率高),在多线程下不建议使用ArrayList

二、 ArrayList 的底层操作机制源码分析(重点,难点.)

1.JDK8.0

  1. ArrayList中存放了一个Object类型的数组elementDate,什么类型都能往里面放

    • transient Object[] elementDate;

      • transient表示该属性不会被序列化
  2. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍
  3. 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

注意:

  • mount 表示的该数组的修改次数

注意:

  • >>1代表二进制位向右移两位,表示大小/2,这里的int newCapacity = oldCapacity + (oldCapacity >> 1),代表扩容按旧数组的1.5倍进行扩容(除第一次).
  • newCapacity - minCapacity < 0
    • 第一次扩容:newCapacity = 0minCapacity = 10,即当最小容量比新容量小的时候,把minCpacaity 赋给 newCapacity,只有第一次扩容会执行这个if

      • 如果newCapacity 比最大的大小还要大时
      • 执行hugeCapacity这个方法
    • 利用copyOf,把原数组的内容拷贝到新数组里面去,并让elementData指向该方法返回回来的地址,这样可以在保留原来数组中元素的同时,并增加新的空间,新空间默认为null;

若是使用指定大小的构造器

  • 第一次扩容就按照elemenData的1.5倍扩容

    • 整个执行流程还是和前面讲的一样

2.JDK11.0

使用ArrayList无参构造器,会创建一个只读的静态的,类型为Object的空数组

存储数据底层实现原理:

  1. 调用add方法,参数:e为你要存储的数据(大概).
  2. modCount:为对该集合的操作次数,默认为0
  3. 调用 add 方法(重载后的add方法)

  • 当前元素个数 == 当前数组长度,就会进行扩容

    • 之后让elementData[s] = e,s为当前元素个数,且让size = s +1
  1. 如果要进行扩容

  • 返回一个扩容后的数组,利用copyOf方法,把原来的数组元素,拷贝到新数组中,且新数组的长度为原来数组+1;
  • 然后在执行下面的赋值操作,同上

newCapacity方法

  • 调用newCapacity,确定要扩大的空间
  • oldCapacity 为当前数组的长度
  • newCapacity 为扩容后新数组的长度:为旧数组长度的1.5倍

如果新数组的长度,比需要的(最小)容量小,则执行下面的代码

  • DEFAULT_CAPACITY为int 类型 ,值为10,如果elementaData 为空数组(DEFAULTCAPACTY_EMPTY_ELEMENTDATA),那么就用把mincapacity和DEFAULT_CAPACITY传进去进行比较,返回最大值,这个最大值就是要新数组的容量

    • 如果minCapacity<0 则抛出异常
    • 并返回mincapacity

如果新数组的长度,大于需要的(最小)容量,则执行下面的代码

  • 三元表达式,这里比较简单不做阐述

最新文章

  1. 状态模式(State Pattern)
  2. [ASE][Daily Scrum]11.30
  3. vector容器的用法
  4. Python中利用LSTM模型进行时间序列预测分析
  5. HDU1495(bfs)
  6. python使用sqlite3
  7. vertical-align各属性对比
  8. bzoj4828 [Hnoi2017]大佬
  9. mysql导出导入数据
  10. Vuex的API文档
  11. Web API中的路由(一)——约定路由
  12. JMeter 中_time 函数的使用(时间戳、当前时间)
  13. rownum和分析函数 over
  14. Kotlin 范型约束
  15. C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏
  16. FlowPortal-BPM——功能:判断数据库表中字段是否重复并阻止提交或保存
  17. 更改backend
  18. BZOJ 3527 【ZJOI2014】 力
  19. 【并发编程】Future和FutureTask以及CompletionService
  20. 三、hbase JavaAPI

热门文章

  1. 资本主义反抗指南精要(v0.1)
  2. 李宏毅强化学习完整笔记!开源项目《LeeDeepRL-Notes》发布
  3. HTC组件介绍及应用 HTML
  4. linux sftp
  5. lua语言:string
  6. socket在php作用
  7. C#项目版本号自定义位置自动向上增加小工具设计与实现
  8. Spring Boot 自动配置(基本配置)
  9. 1、Oauth概念与模式
  10. PostgreSQL VACUUM 之深入浅出 (四)