码迷,mamicode.com
首页 > 编程语言 > 详细

Java之集合(三)ArrayList

时间:2017-08-05 21:12:44      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:相同   位置   查询   接口   方法   简单的   抽象   数组下标   list   

  转载请注明源出处: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

标签:相同   位置   查询   接口   方法   简单的   抽象   数组下标   list   

原文地址:http://www.cnblogs.com/lighten/p/7291339.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!