注:玩的是JDK1.7版本

1:先尝栗子,再分析,代码简单,注释清晰,可自玩一下

/**
* @description:测试集合遍历和移除元素的方式
* @author:godtrue
* @create:2018-09-13
*/
public class TestTraverseStyle {
/**
* 开始循环的基值
*/
private static final int START_LOOP = 1; /**
* 结束循环的基值
* 我的机器 1亿 次就卡死了,我就实验下 1千万 次吧! 10000000
*/
private static final int END_LOOP = 10000000; /**
*
*@description: 测试入口,主方法
*@param args
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
public static void main(String[] args) { List<String> list = genList(); /**
* 循环list的方式一及其变种
*/
//traverseByLoop(list);
//traverseByLoop1(list);
//traverseByLoop2(list);
//traverseByLoop3(list);
//traverseByLoop4(list); /**
* 循环list的方式二及其变种
*/
//traverseByIterator(list);
//traverseByIterator2(list);
//traverseByIteratorForeach(list); /**
* 遍历时移除元素,会抛出 java.lang.IndexOutOfBoundsException
*/
//traverseByLoopRemoveEle(list);
/**
* 遍历时移除元素,需要先调用 next()方法,否则会抛出 java.lang.IllegalStateException
*/
traverseByIteratorRemoveEle(list);
traverseByIteratorRemoveEle2(list);
/**
* 遍历时移除元素,会抛出 java.util.ConcurrentModificationException,这种方式本身就是存在问题的,不可使用
*/
//traverseByIteratorForeachRemoveEle(list);
} /**
*
*@description: 循环遍历 list 集合,不推荐的方式,多次获取集合的长度
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoop(List list){
long startTime = System.currentTimeMillis();
for(int i=0;i<list.size();i++){
list.get(i);
}
System.out.println("exe traverseByLoop cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 循环遍历 list 集合,推荐的方式,性能好一些,只获取一次集合长度,且集合的长度可以继续使用
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoop1(List list){
long startTime = System.currentTimeMillis();
int sum=list.size();
for(int i=0;i<sum;i++){
list.get(i);
}
System.out.println("exe traverseByLoop1 cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 循环遍历 list 集合,推荐的方式,性能好一些,只获取一次集合长度,集合长度不在循环外使用
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoop2(List list){
long startTime = System.currentTimeMillis();
for(int i=0,sum=list.size();i<sum;i++){
list.get(i);
}
System.out.println("exe traverseByLoop2 cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 循环遍历 list 集合,从尾部开始遍历
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoop3(List list){
long startTime = System.currentTimeMillis();
for(int sum=list.size()-1;sum>=0;sum--){
list.get(sum);
}
System.out.println("exe traverseByLoop3 cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 循环遍历 list 集合,从尾部开始遍历
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoop4(List list){
long startTime = System.currentTimeMillis();
for(int sum=list.size();sum>0;){
list.get(--sum);
}
System.out.println("exe traverseByLoop4 cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByIterator(List list){
long startTime = System.currentTimeMillis();
for (Iterator i=list.iterator(); i.hasNext(); ){
i.next();
}
System.out.println("exe traverseByIterator cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByIterator2(List list){
long startTime = System.currentTimeMillis();
Iterator i=list.iterator();
while (i.hasNext()){
i.next();
}
System.out.println("exe traverseByIterator2 cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合,编译器的语法糖
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByIteratorForeach(List list){
long startTime = System.currentTimeMillis();
for (Object o : list){
}
System.out.println("exe traverseByIteratorForeach cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 循环遍历 list 集合时,移除元素,这是一种错误的示范
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoopRemoveEle(List list){
long startTime = System.currentTimeMillis();
for(int i=0,sum=list.size();i<sum;i++){
list.remove(list.get(i));
}
System.out.println("exe traverseByLoopRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合时,移除元素,这是一种有效的方式
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByIteratorRemoveEle(List list){
long startTime = System.currentTimeMillis();
for (Iterator i=list.iterator(); i.hasNext(); ){
i.next();
i.remove();
}
System.out.println("exe traverseByIteratorRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合时,移除元素,这是一种有效的方式
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByIteratorRemoveEle2(List list){
long startTime = System.currentTimeMillis();
Iterator i=list.iterator();
while (i.hasNext()){
i.next();
i.remove();
}
System.out.println("exe traverseByIteratorRemoveEle2 cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 迭代遍历 list 集合时,移除元素,这是一种错误的示范
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByIteratorForeachRemoveEle(List list){
long startTime = System.currentTimeMillis();
for (Object o : list){
list.remove(o);
}
System.out.println("exe traverseByIteratorForeachRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
} /**
*
*@description: 生成 ArrayList 数据信息
*@param
*@return: java.util.List<java.lang.String>
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static List<String> genList(){
long startTime = System.currentTimeMillis();
List<String> list = new ArrayList<String>();
for(int i = TestTraverseStyle.START_LOOP; i< TestTraverseStyle.END_LOOP; i++){
list.add(String.valueOf(i));
}
System.out.println("exe genList cost time : "+(System.currentTimeMillis()-startTime));
return list;
} }

2:注意事项

1)按如下方式循环遍历 list 集合时,移除元素,会抛出 java.lang.IndexOutOfBoundsException

    /**
*
*@description: 循环遍历 list 集合时,移除元素,这是一种错误的示范
*@param list
*@return: void
*@author: godtrue
*@createTime: 2018-09-13
*@version: v1.0
*/
private static void traverseByLoopRemoveEle(List list){
long startTime = System.currentTimeMillis();
for(int i=0,sum=list.size();i<sum;i++){
list.remove(list.get(i));
}
System.out.println("exe traverseByLoopRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
}

2)按如下方式循环遍历 list 集合时,移除元素,会抛出 java.util.ConcurrentModificationException,这种方式本身就是存在问题的,不可使用

3)按如下方式遍历时移除元素,需要先调用 next()方法,否则会抛出 java.lang.IllegalStateException

4)如下是编译器的语法糖,以及正确的遍历时移除元素的示范,前面两种方式

分析轮子(八)- List.java 各种遍历方式及遍历时移除元素的方法的更多相关文章

  1. Java易错知识点(1) - 关于ArrayList移除元素后剩下的元素会立即重排

    帮一个网友解答问题时,发现这样一个易错知识点,现总结如下: 1.易错点: ArrayList移除元素后,剩下的元素会立即重排,他的 size() 也会立即减小,在循环过程中容易出错.(拓展:延伸到所有 ...

  2. Java学习--数组--判断数组中是否包含某个元素的方法

    package zaLearnpackage; import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; import ...

  3. C#遍历集合与移除元素的方法

    如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { Li ...

  4. Java 反射实现实体转Map时,父类元素丢失

    public class BeanToMap { public static Map<String, Object> ConvertObjToMap(Object obj) { Map&l ...

  5. Java Map遍历方式的选择

    [原文] 1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keyS ...

  6. Java Map各遍历方式的性能比较

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...

  7. java map遍历方式及效率

    本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...

  8. list的四种遍历方式

    1.手先增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容.不能获 ...

  9. 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法

    具体见第三阶段scala-day01中的文档(scala编程基础---基础语法)  1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ...

随机推荐

  1. HDU 4768 Flyer【二分】||【异或】

    <题目链接> <转载于  >>> > 题目链接: n个社团派发传单,有a,b,c三个参数,派发的规则是,派发给序号为a,a+c....a+k*c,序号要求是小 ...

  2. CSRF自动化检测

    CSRF自动化检测: 这里主要是对POST型form表单的检测 1. 根据URL获取form表单组成的数组 2. 遍历表单数组,对比不设置cookie与设置了cookie两种情况下的表单是否还存在,如 ...

  3. 一种表达式语言的解析引擎JEXL简单使用

    Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity ...

  4. 9. Fizz Buzz 问题

    Description Given number n. Print number from 1 to n. But: when number is divided by 3, print " ...

  5. Django之模板2

    模板2 一 . 母版 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. [Python] dict对象的keys()和values()返回的值,是否总是保证一一对应?

    搜dict的key, value顺序, 中文没搜到想要的结果. 英文答案链接:python-dictionary-are-keys-and-values-always-the-same-order 在 ...

  7. Lucene入门实例-CRUD

    1.导入jar包 lucene-analyzers-common-7.6.0.jar lucene-analyzers-smartcn-7.6.0.jar lucene-core-7.6.0.jar ...

  8. Python3之弹性力学——应力张量2

    问题 已知某应力张量的分量为 \[ \sigma_{11}=3,\quad\sigma_{12} = \sigma_{13} = 1, \quad \sigma_{22} = \sigma_{33} ...

  9. IAR map 文件报告与Flash 大小关系

  10. openssl可以实现:秘钥证书管理、对称加密和非对称加密

     openssl enc -e -aes-128-cbc -iv 0102030405060708 -K 1234567890123456 -in input.xml -out output.xml( ...