ArrayList分析

  ①创建ArrayList()

     默认通过调用其构造方法ArrayList(int i)来完成ArrayLIst的创建,如:

    ArrayList list = new ArrayList(12);

    这时候在其构造方法内部其实是创建了一个大小为12的Object的数组。

   当没有传入数组容量值得时候 默认会创建一个为10的Object数组。因此ArrayList的实现是基于数组的方式来实现元素的存储。

 ②插入对象:add(E)

   由于ArrayList是基于数组实现的,那么当调用add()方法的时候,其实质就是向数组内添加新的元素。接下来看看其怎么实现动态改变ArrayList大小的原理吧。

   当调用ArrayList的add()方法的时候 ,首先会ArrayList中已有的元素的数量增加1,产生一个最小容量值 minCapacity的变量,然后会将此值与ArrayList内部数组

  的大小进行比较,如果此值小于数组的大小 ,那么会将次对象直接插入到数组的末尾处(自己猜测),如果此minCapacity的值大于数组的值 ,那么说明该数组有可能已经不能

  容纳更多的元素了,那么这时候ArrayList会怎么做呢?它会将原来的数组赋值给一个新的数组对象,但是这个新的数组数组对象的元素的个数的确定是怎么实现的

  呢 ?计算方法为 :会将原来的数组的大小*1.5+1,如果此值仍然小于之前的minCapacity的值,那么就会以minCapacity的值作为新的数组对象的大小,最后通过

 调用Arrays.copyOf()来生成新的数组对象。

 ArrayList还提供add(int,E)方法 。允许你添加特定为的元素对象,但是前提这个位置是存在的,数组的容量是够用的,实现方式上,会将index和其之后的元素向后挪动以为,让出原来的index的位置 来插入新的元素,可见这种方式是多付出一次数组的复制的。

  ③删除对象 remove(E)

   当执行此方法的时候,会检查要删除的对象是否为null,如果为null会遍历数组中已有的值,比较里面的值是否为null 如果为null会删除相应位置的对象,接着会将删除对象位置之后的对象向前复制以为,并将数组最后一个元素的值设置为null来释放对此对象的引用,如果里面的值不为null的话,会调用对象的equals方法比较对象是否相同 (也是要遍历整个数组的),如果相同会删除这个位置的对象,剩下的操作和为null的操作一样。

 另外ArrayList还提供了romove(int index)方法来删除制定为的对象 ,首先会检查其是否会数组越界 ,但是不会遍历整个数组,因此性能会比较好。

 ④获取对象get(int index)

  传入的值就是对象在数组中的位置 ,但是前提会检查数组是否越界 ,如果没有,那么就会返回数组中位于此位置的对象。

 ⑤ 遍历对象iterator()

  iterator是有ArrayList的父类AbstractList实现,当每次调用iterator()方法时,都会创建一个新的Itr实例,当调用此实例的hasNext()时,会比较当前数组的位置和数组中已经元素  的个数是否相等,如果相等说明到达末尾 ,返回false ,否则返回true。

 当调用next方法时候则会调用get(int)  来获得相应的对象。

⑥判断是否包含某个对象contains(E)
 这个操作会遍历整个数组中已有的对象,如果E为null,则直接判断数组中是否有null 如果有就返回true,否则返回false。如果E不为null,会调用equals方法来比较是否相等,  相等返回true 否则返回false。

 indexOf和lastIndexOf是获取对象所在的位置,其中前者是从前往后寻找,后者正好相反。

总结:

 ArrayList是基于数组实现的,没有容量的限制。

再删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量。

ArrayList是非线程安全的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飓风zj

感谢打赏,thanks

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值