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 = 0,minCapacity = 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

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

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

JAVA ArrayList集合底层源码分析的更多相关文章

  1. 设计模式(十七)——迭代器模式(ArrayList 集合应用源码分析)

    1 看一个具体的需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统的设计方案(类图) 3 传统的方式的问题分析 ...

  2. Java的LinkedList底层源码分析

    首先我们先说一下,源码里可以看出此类不仅仅用双向链表实现了队列数据结构的功能,还提供了链表数据结构的功能.

  3. List-ArrayList集合基础增强底层源码分析

    List集合基础增强底层源码分析 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 集合分为三个系列,分别为:List.set.map List系列 特点:元素有序可重复 有序指的是元素的 ...

  4. List-LinkedList、set集合基础增强底层源码分析

    List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...

  5. 你真的了解java的lambda吗?- java lambda用法与源码分析

    你真的了解java的lambda吗?- java lambda用法与源码分析 转载请注明来源:cmlanche.com 用法 示例:最普遍的一个例子,执行一个线程 new Thread(() -> ...

  6. ArrayList详解-源码分析

    ArrayList详解-源码分析 1. 概述 在平时的开发中,用到最多的集合应该就是ArrayList了,本篇文章将结合源代码来学习ArrayList. ArrayList是基于数组实现的集合列表 支 ...

  7. Vector总结及部分底层源码分析

    Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...

  8. LInkedList总结及部分底层源码分析

    LInkedList总结及部分底层源码分析 1. LinkedList的实现与继承关系 继承:AbstractSequentialList 抽象类 实现:List 接口 实现:Deque 接口 实现: ...

  9. java线程池ThreadPoolExector源码分析

    java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...

随机推荐

  1. from 表单上传多个文件?

    和单个上传文件基本相同,就是需要在后台控制器中,用数组来接收 jsp页面提交过来的file数据. 也分为三个部分演示. 一.jsp <%-- Created by IntelliJ IDEA. ...

  2. Python中列表操作函数append的浅拷贝问题

    L=int(input())#L位数N=int(input())#N进制row=[]list1=[]for i in range(1,N): row.append(1)list1.append(row ...

  3. 自动归档autoArchive By H.l

    写点简单的代码,让开发更简单 详情:ios 应用实现快速的临时缓存之模型的自动归档 Demo:https://files.cnblogs.com/files/sixindev/AutoArchiver ...

  4. Pytest用例编写1

      一.编写pytest测试样例非常简单,只需要按照下面的规则: 测试文件以test_开头(以_test结尾也可以) 测试类以Test开头,并且不能带有 __init__ 方法 测试函数以test_开 ...

  5. HTML笔记整理--下节

    欢迎来到HTML基础笔记下节部分! 内联样式 当特殊的样式需要应用到个别元素时,就可以使用内联样式. 使用内联样式的方法是在相关的标签中使用样式属性.样式属性可以包含任何 CSS 属性.以下实例显示出 ...

  6. Spring系列14:IoC容器的扩展点

    Spring系列14:IoC容器的扩展点 回顾 知识需要成体系地学习,本系列文章前后有关联,建议按照顺序阅读.上一篇我们详细介绍了Spring Bean的生命周期和丰富的扩展点,没有阅读的强烈建议先阅 ...

  7. Solution -「CEOI 2017」「洛谷 P4654」Mousetrap

    \(\mathscr{Description}\)   Link.   在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...

  8. Dubbo服务注册到Zookeeper,对外提供服务的实际类 ref(如:SleepServiceImpl)保存在哪里

    Dubbo服务注册到Zookeeper,其注册的内容为实际对外提供的服务的实现.这个实现保存在哪里(至于具体客户端使用时怎么取后后续阐述)?可以看看Dubbo如何处理的. 对于@DubboServic ...

  9. Centos7.+系统,二进制包脚本安装Mysql

    #!/bin/bash #配置数据库要安装的目录,可以根据自己的安装路径修改PATHDIRPATHDIR="/project"BASEDIR="$PATHDIR/mysq ...

  10. Python+selenium自动循环发邮件

    Python源代码如下: # coding=utf-8 from selenium import webdriver from time import sleep from random import ...