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 ...
随机推荐
- arduino 串口数据啊按字节分析
#include <avr/wdt.h> #include <SoftwareSerial.h> #include <EEPROM.h> #define FPIN ...
- qmake -简介
qmake 简化了在不同平台下开发项目时构建处理的过程. qmake 自动产生Makefiles文件,只需要几行信息来构建每个Makefile.qmake可以被用于任何软件项目,不管是否使用Qt. q ...
- struts2 action 中autowired 不能注入
一.pom.xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>stru ...
- 如何使用masonry设计复合型cell[转]
前言 其实早在@sunnyxx同学发布UIView-FDCollapsibleConstraints的时候 我就说要写一下怎么用代码来稍微麻烦的实现复用的问题 但是一直各种没时间(主要是我的办法太复杂 ...
- jQueryUI datepicker 报错: TypeError: inst is undefined
前提:要引用的js等都引用好了 调用日期控件的input: <input id="starttime" name="starttime" class=&q ...
- MySQL性能调优与架构设计——第 15 章 可扩展性设计之Cache与Search的利用
第 15 章 可扩展性设计之Cache与Search的利用 前言: 前面章节部分所分析的可扩展架构方案,基本上都是围绕在数据库自身来进行的,这样是否会使我们在寻求扩展性之路的思维受到“禁锢”,无法更为 ...
- vim 配置半透明
转载两个博客 链接一 链接二
- hdu 4981
中位数是否大于平均数 水题 #include <cstdio> #include <cstdlib> #include <cmath> #include <c ...
- oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)
先列上我的数据库表格: c_date(Date格式) date_type(String格式) 2011-01-01 0 2012-03-07 ...
- NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(转载)
原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_FluentValidation_1.html 阅读目录 1.基本介绍 ...