Java之集合(三)ArrayList
转载请注明源出处:http://www.cnblogs.com/lighten/p/7291339.html
1.前言
本章介绍List中最常用的一个类--ArrayList。在第一章中已经介绍了List接口和抽象父类AbstractList,虽然ArrayList继承了抽象父类,不过其中的大部分方法都进行了覆盖重写。ArrayList的结构比较简单,下面看看其是如何实现的。
2.ArrayList

其数据结构非常简单,就是一个数组,再加上一个计算元素个数的size。默认初始化数组大小是10。扩容方式如下:

默认扩容原数组长度的两倍,也就是新的数组大小是原来的三倍,但是指定扩容的值比这个值还大的情况,使用制定的值。
size()和isEmpty方法都是依靠size这个计数字段完成。contains(Object)方法借助于indexOf(Object)方法,做法就是遍历了。


值得一提的是ArrayList实现了Cloneable接口,其拷贝只是拷贝了这个List对象,而没有拷贝list中的元素,这意味着两个list持有的是同一组对象。当然这样并没什么问题,因为对List操作并不会影响到里面的元素,而如果影响到元素的时候,就要看实际使用了。
add方法就是在末尾加1,指定位置add就需要移动数组的元素了:

remove方法也是相同的原理,移除然后移动数组。值得一提的是clear方法:

其将数组中的对象引用都置为了null,为的是让GC更好的工作。还有一个可以一提的就是

其它的还就是ArrayList也没有使用抽象父类的Itr和ListItr以及SubList,其全部自己重新定义了。当然并没有在原理上有什么区别,仅仅只是实现有点小区别,也是更贴近了ArrayList的数组结构。
3.图

这是一个简单的插入示意图,先移动数组中的元素,然后将其放入指定位位置。移除就是直接将后面的往前移动一位,最后一位置为Null。从这种操作方式就可以看出ArrayList的特点:对于查询而言,其很简单,循环数组就可以了,并且如果知道下标,更是可以直接返回数组下标。但是对于添加删除而言,如果是在中间操作,就会涉及数组的移动了,这样比较麻烦,即使是在末尾添加,也涉及数组扩容,再次移动数组。所以使用ArrayList的时候,如果可以预估数组大小,就尽量设置初始容量,这样至少比10这个默认值要好,可以少发生扩容的移动操作。
Java之集合(三)ArrayList的更多相关文章
- Java基础-集合框架-ArrayList源码分析
一.JDK中ArrayList是如何实现的 1.先看下ArrayList从上而下的层次图: 说明: 从图中可以看出,ArrayList只是最下层的实现类,集合的规则和扩展都是AbstractList. ...
- JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14
一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...
- java List集合记录 ArrayList和LinkedList的区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Java基础--集合解析-ArrayList
1.ArrayList中添加,获取,删除元素: 2.ArrayList中是否包含某个元素: 3.ArrayList中根据索引将元素数值改变(替换): 4.ArrayList中查看(判断)元素的索引: ...
- Java自学-集合框架 ArrayList常用方法
ArrayList常用方法 步骤 1 : 增加 add 有两种用法: 第一种是直接add对象,把对象加在最后面 heros.add(new Hero("hero " + i)); ...
- Java自学-集合框架 ArrayList和LinkedList的区别
ArrayList和LinkedList的区别 步骤 1 : ArrayList和LinkedList的区别 ArrayList ,插入,删除数据慢 LinkedList, 插入,删除数据快 Arra ...
- Java自学-集合框架 ArrayList和HashSet的区别
Java ArrayList和HashSet的区别 示例 1 : 是否有顺序 ArrayList: 有顺序 HashSet: 无顺序 HashSet的具体顺序,既不是按照插入顺序,也不是按照hashc ...
- JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API
森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397 文章- 0 评论- 78 JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...
- 从源码看Java集合之ArrayList
Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int ...
随机推荐
- Django入门与实践-第23章:分页实现(完结)
http://127.0.0.1:8000/boards/1/ #从现在起,我们将在 board_topics 这个视图中来操作. python manage.py shell from django ...
- web页面中a标签下载文件包含中文下载失败的解决
之前用到的文件下载,文件名都是时间戳的形式或者英文名.下载没有问题.后来附件有中文后写在页面是下面效果,点击下载,下载失败. 对应链接拿出来.是如下效果 之前用了各种其他办法都不理想,比如转义什么的. ...
- 61 origin授控于MATLAB
官方教程:http://www.originlab.com/forum/topic.asp?TOPIC_ID=22339 学习自白东升老师originPRO8.0教程. 我用的是origin pro2 ...
- QGIS 2014年7月18日版本
4. Building on Windows 4.1. Building with Microsoft Visual Studio This section describes how to buil ...
- 关闭父类弹出的ifream窗口
parent.document.getElementById('zhuce').style.display = 'none';
- 为Quartus工程生成rbf文件的方法
rbf文件是Quartus编译生成的fpga配置文件的二进制数据量格式的文件,主要用于使用外部主机通过PS方式配置FPGA. 在含ARM硬核的SoC FPGA中,可以使用HPS配置FPGA,配置时分为 ...
- java 格式化输出 printf 总结
double d = 345.678; String s = "hello!"; ; //"%"表示进行格式化输出,"%"之后的内容为格式的 ...
- 4张图看懂delphi 10生成ipa和在iPhone虚拟器上调试(教程)
4张图看懂delphi 10生成ipa和在iPhone虚拟器上调试(教程) (2016-02-01 03:21:06) 转载▼ 标签: delphi ios delphi10 教程 编程 分类: 编程 ...
- 项目笔记---WPF之Metro风格UI
写在前面 作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃. 切入正题, ...
- Spring Boot 2 实践记录之 MySQL + MyBatis 配置
如果不需要连接池,那么只需要简单的在pom文件中,添加mysql依赖: <dependency> <groupId>mysql</groupId> <arti ...