遍历一个 List 有哪些不同的方式?
-
for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素, 当读取到最后一个元素后停止。
-
迭代器遍历,Iterator。Iterator 是面向对象的一个设计模式,目的是屏蔽不同数据集合的特 点,统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。
-
foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,使用时不需要显式声明 Iterator 或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能在遍历过 程中操作数据集合,例如删除、替换。
如何选择遍历方式 :
Java Collections 框架中提供了一个 RandomAccess 接口,用来标记 List 实现是否支 持 Random Access。
如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位置读取元素的平均 时间复杂度为 O(1),如ArrayList。
如果没有实现该接口,表示不支持 Random Access,如LinkedList。
推荐的做法就是,支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator 或 foreach 遍历。
说一下 ArrayList 的优缺点
ArrayList的优点如下:
-
ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了 RandomAccess 接口, 因此查找的时候非常快。
-
ArrayList 在顺序添加一个元素的时候非常方便。
ArrayList 的缺点如下:
-
删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性 能。
-
插入元素的时候,也需要做一次元素复制操作