zoukankan      html  css  js  c++  java
  • 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这个默认值要好,可以少发生扩容的移动操作。

  • 相关阅读:
    centos6安装创建kvm虚拟机
    centos6安装创建kvm虚拟机
    centos6安装创建kvm虚拟机
    centos6安装创建kvm虚拟机
    18岁主动申请退学,22岁就成了百万富翁,他怎样创业的?
    多次创业转向餐饮业,他开了10家小店,生意红火
    为挽救濒临破产企业,他提出的方案竟然“一炮而红”
    靠开焊接厂赚了很多钱,他的成功很经典,值得参考
    一道传统特色小吃让她萌生创业想法,一天能挣800元
    蛋糕做出新高度,投资不高却收入“甜蜜”,他们怎样做的?
  • 原文地址:https://www.cnblogs.com/lighten/p/7291339.html
Copyright © 2011-2022 走看看