复习-arrary和arraylist的对比以及arraylist的遍历中删除的原理

1.空间大小

array是不可变的,必须事先控制其大小。arraylist是可扩容数组,每次扩大容量的0.5倍。

2.存放内容

array只能存放相同类型的元素,但存放对象可以是基本类型或者对象类型

arraylist可以存放不同类型的元素(object),但存放对象只能是对象类型,而且如果加上<>的话,就是指定类型了。

3.使用方法

arraylist在array的基础上增加了例如addall(),removeall(),iterator()等常用方法。注意:我们经常需要在遍历元素的同时对数组中的元素进行增删改,此时如果array的话,用增强for循环没有办法删除的,只能用普通for循环进行遍历,但是不能删除,因为数组长度是固定的,只能将对应的索引的值变化一下,等循环结束之后赋值给新数组。

而arraylist在普通for循环的时候,如果调用list.remove,会自动进行元素删除以及arrys.copyof方法(也就是新数组生成),所以如果边循环边删除的时候会出现一个问题,第一个问题是,被删除的相邻元素其实不会被访问到,被直接跳过了。

arraylist在增强for循环或者foreach中,其实都是在使用迭代器方法,但是他们只是查询用迭代器,并没有使用迭代器的删除方法(iterator.remove()),会出现只有modCount增加了,但是expectedModCount却没有变化,所以在进行list.remove()操作的时候,会在modCount==expectedModCount处出现错误,导致出现ConcurrentModificationException异常。

但是arrylist在用迭代器进行遍历并且进行删除的时候就不会出错,为什么呢,因为你会发现你在迭代器里面用的是 iterator.remove() ,去源码里面看你会发现,迭代器在使用list本身的删除方法之外(list.remove()),还让modCount==expectedModCount,这就使得两个变量一致了,再进行删除的时候,就不会报异常了。

4.应用场景

如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就可以选择ArrayList。

而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值