首页 > 编程语言 >ArrayList的源码分析(一)

ArrayList的源码分析(一)

时间:2022-11-30 15:33:55浏览次数:33  
标签:分析 构造方法 ArrayList 源码 参数 数组 集合 长度 arraylist


我想大家既然能看到这篇文章我就不用解释Arraylist是啥了,简单点说就是一个动态对象数组,然后就这个集合的源代码拿出来给大家分析一下我的个人看法和收获,实例代码是jdk1.8的源代码

首先可以看到,Arraylist这个类继承了AbstractList这个类,实现了list这个接口等等

ArrayList的源码分析(一)_对象数组

然后我们来看看它的一些属性: 

从这里可以看到arraylist的默认长度为10,也就是说明当你创建一个arraylist的时候它默认的长度为10

ArrayList的源码分析(一)_ArrayList的扩容_02

这就是arraylist集合的本体,在这里证明了ArrayList的底层就是对象数组,并且默认是个空的

ArrayList的源码分析(一)_构造方法_03

这是arraylist的长度属性,它的size()方法就是直接返回这个size,这个长度指的是集合的长度,而不是底层对象数组的容量

ArrayList的源码分析(一)_构造方法_04

Arraylist的长度也不是无限的,最大长度为Integer的最大长度-8

ArrayList的源码分析(一)_数组_05

接下来咱们来看看它的构造方法,:

首先是无参的构造方法,在这里可以看的明天创建了一个长度为10的对象数组,在方法体中的变量在上方都有介绍

ArrayList的源码分析(一)_ArrayList的扩容_06

第一个有参的构造方法,在这里可以看的出构造方法中的参数就是你创建对象数组的长度,当你使用这个构造方法的时候你就能指定你创建集合的长度,某些情况下这样能优化集合的性能,具体大家可以去看看我​​   如果参数为0的话则依然使用默认的长度10,负数则出现异常

ArrayList的源码分析(一)_对象数组_07

接下来看看第二个有参的构造方法,这里的参数认为只能放Collection的子类   首先将参数集合转成数组用对象数组接收,分两种情况,如果参数集合的长度不是0的话,则继续判断这个数组的类型是不是对象数组,如果不是则复制成一个对象数组,如果该集合的长度为0,那么生成一个为空的arraylist

ArrayList的源码分析(一)_ArrayList的扩容_08

咱们再来看看我们常用的方法的一些源码,看看到底arraylist怎么样实现动态数组

首先是add方法

这个是我们常用的add方法,直接放一个对象添加到集合中去,然后我一步步跟踪看看它是怎么样添加的

ArrayList的源码分析(一)_ArrayList源代码分析_09

,首先是执行了一个ensureCapacityInternal方法,而它的参数就是当前数组长度加一   elementData是当前集合数组的一个缓冲数组

ArrayList的源码分析(一)_构造方法_10

接下来看看calculateCapacity方法, 如果缓冲数组就是集合本体数组的话,则返回两个参数中较大的一个,参数一为默认长度10

但是如果不是的话就返回当前集合的size+1   

ArrayList的源码分析(一)_ArrayList的扩容_11

在看看ensureExplicitCapacity方法,这个方法翻译为确保明确的容量,看名字大概也能猜出一点是干啥的.这个判断是如果当前集合长度+1的数减去缓冲数组的长度>0的话执行grow方法,参数为当前集合长度+1,也就是mincapacity

ArrayList的源码分析(一)_构造方法_12

这就是grow方法,  首先用一个int oldCapacity接收,缓冲数组的长度,也就是旧数组的长度,再定义一个新数组的长度newCapacity,这个变量的长度为旧数组的长度加上旧数组的一半的长度,关于这个符号>> 这就是为什么别人说arraylist的扩容机制是1.5倍的所在,后面这两个判断是判断有没有超过容量或者是新数组的长度过小,最后就是一个copy数组的过程,参数1为旧数组,参数2为新数组的长度,  然后用缓冲数组来接收,关于这个缓冲数组的官方介绍:

存储ArrayList元素的数组缓冲区。   ArrayList的容量是此数组缓冲区的长度。添加第一个元素时,任何带有elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA  的空ArrayList都将扩展为DEFAULT_CAPACITY   

也就是说在改变arraylist的数组之后缓冲数组就是集合的底层数组

ArrayList的源码分析(一)_构造方法_13

标签:分析,构造方法,ArrayList,源码,参数,数组,集合,长度,arraylist
From: https://blog.51cto.com/u_15897407/5899832

相关文章

  • ArrayList的源码分析(二)
    上篇文章给大家介绍了arraylist集合源码的一些属性和扩容方式add方法,接下来再和大家来聊聊这个集合的一些源码首先看看remove的方法,这个方法有两个,一个是根据下标删除对......
  • Mybatis源码分析(十五) - 缓存技术
    MyBatis包含一个非常强大的查询缓存特性,使用缓存可以使应用更快地获取数据,避免频繁的数据库交互 缓存查询图: 一级缓存(也叫应用缓存)一级缓存默认会启用,想要关闭一级缓存......
  • Mybatis源码分析(十三) - 关联查询之多对多
    我的理解是,多对多其实就是两个一对多。嵌套结果:示例代码:<selectid="selectUserRole"resultMap="userRoleInfo">selecta.id,a.user_name,a.real......
  • Mybatis源码分析(十四) - discriminator 鉴别器映射
    在特定的情况下使用不同的pojo进行关联,鉴别器元素就是被设计来处理这个情况的。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句discriminator标签常用的......
  • Mybatis源码分析(十七) - 源码包分析【日志模块】
    mybatis源码下载地址:​​https://github.com/mybatis/mybatis-3​​MyBatis源码导入过程:下载MyBatis的源码检查maven的版本,必须是3.25以上,建议使用maven的最新版本mybatis的......
  • Mybatis源码分析(二十一) - 核心流程分析
    mybatis核心流程三大阶段初始化阶段读取XML配置文件和注解中的配置信息,创建配置对象,并完成各个模块的初始化的工作代理阶段封装iBatis的编程模型,使用mapper接口开发的初始化......
  • Tomcat之tomcat架构分析
    Tomcat的目录结构 bin执行目录sh文件liux上的,bat文件windows上的confcatalina.policy 权限相关Permission,Tomcat是跑在jvm上的,所以有些默认的权限server.xml: Server节......
  • windows下编译调试 Elasticsearch 8.7.0 源码
    最近想从代码层面学习下ElasticSearch,于是下载代码并导入到idea中,开始一顿操作,gradle各种倒腾,还是没法直接从代码运行进程,最后选择了一种不那么直接的debug方法,远程......
  • Spring 框架的设计理念与设计模式分析
     ​​https://github.com/javahongxi​​Spring作为现在最优秀的框架之一,已被广泛的使用并有很多文章分析它。本文将从另外一个视角试图剖析出Spring框架的作者设计Spring......
  • tomcat源码分析-http请求在Container中的执行路线
     在CoyoteAdapter的service方法中,主要干了2件事:  1.org.apache.coyote.Request->org.apache.catalina.connector.RequestextendsHttpServletRequest     ......