博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList全面总结
阅读量:5751 次
发布时间:2019-06-18

本文共 1696 字,大约阅读时间需要 5 分钟。

  概述:ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capacity属性,表示它们所封装的Object[]数组的长度,当向ArrayList中添加元素时,该属性值会自动增加。如果想ArrayList中添加大量元素,可使用ensureCapacity方法一次性增加capacity,可以减少增加重分配的次数提高性能。ArrayList的用法和Vector向类似,但是Vector是一个较老的集合,具有很多缺点,不建议使用。另外,ArrayList和Vector的区别是:ArrayList是线程不安全的,当多条线程访问同一个ArrayList集合时,程序需要手动保证该集合的同步性,而Vector则是线程安全的。

  类的继承:ArrayList继承AbstractList抽象父类,实现了List接口(规定了List的操作规范)、RandomAccess(可随机访问)、Cloneable(可拷贝)、Serializable(可序列化)。

  类的属性:类的属性中核心的属性为elementData,类型为Object[],用于存放实际元素,并且被标记为transient,也就意味着在序列化的时候,此字段是不会被序列化的。

  类的构造函数1:指定elementData数组的大小,不允许初始化大小小于0,否则抛出异常。

  类的构造函数2:当未指定初始化大小时,会给elementData赋值为空集合。

  类的构造函数3:当传递的参数为集合类型时,会把集合类型转化为数组类型,并赋值给elementData。

  类的主要方法:

    add()源码分析:在add函数我们发现还有其他的函数ensureCapacityInternal,此函数可以理解为确保elementData数组有合适的大小。ensureCapacityInternal的具体函数如下

  在ensureCapacityInternal函数中我们又发现了ensureExplicitCapacity函数,这个函数也是为了确保elemenData数组有合适的大小。ensureExplicitCapacity的具体函数如下

  在ensureExplicitCapacity函数我们又发现了grow函数,grow函数才会对数组进行扩容,ensureCapacityInternal、ensureExplicitCapacity都只是过程,最后完成实际扩容操作还是得看grow函数,grow函数的具体函数如下 

    add()总结:正常情况下会扩容1.5倍,特殊情况下(新扩展数组大小已经达到了最大值)则只取最大值。调用过程:add-->ensureCapacityInternal-->ensureExplicitCapacity-->grow-->hugeCapacity (红色为可能执行)。经分析得到:尽量使用指定容量的数组,以达到节省内存空间的作用。

  类的其他方法:

    set(a) 设定指定下标索引的元素值。

    indexOf() 从头开始查找与指定元素相等的元素,注意,是可以查找null元素的,意味着ArrayList中可以存放null元素的。与此函数对应的lastIndexOf,表示从尾部开始查找。

    get() 会检查索引值是否合法(只检查是否大于size,而没有检查是否小于0),值得注意的是,在get函数中存在element函数,element函数用于返回具体的元素.返回的值都经过了向下转型(Object -> E)

    remove() remove函数用户移除指定下标的元素,此时会把指定下标到数组末尾的元素向前移动一个单位,并且会把数组最后一个元素设置为null,这样是为了方便之后将整个数组不被使用时,会被GC,可以作为小的技巧使用。

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/watchdogzhb/p/10561168.html

你可能感兴趣的文章
Socket编程问题小记
查看>>
基于Flask-Angular的项目组网架构与部署
查看>>
一张图道尽程序员的出路
查看>>
redis 常用命令
查看>>
LVS+Keepalived高可用负载均衡集群架构
查看>>
烂泥:kvm安装windows系统蓝屏
查看>>
iPhone开发面试题--葵花宝典
查看>>
EdbMails Convert EDB to PST
查看>>
POJ 2184
查看>>
大话 程序猿 眼里的 接口
查看>>
struts2用了哪几种模式
查看>>
replace函数结合正则表达式实现转化成驼峰与转化成连接字符串的方法
查看>>
ubuntu 初学常用命令
查看>>
WCF客户端与服务端通信简单入门教程
查看>>
判断是否含有中文
查看>>
linux文件权限与属性的更改
查看>>
android 资源种类及使用
查看>>
Explorer程序出错
查看>>
log4j2性能剖析
查看>>
修改系统时间 ubuntu
查看>>