分析轮子(八)- List.java 各种遍历方式及遍历时移除元素的方法
注:玩的是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 各种遍历方式及遍历时移除元素的方法的更多相关文章
- Java易错知识点(1) - 关于ArrayList移除元素后剩下的元素会立即重排
帮一个网友解答问题时,发现这样一个易错知识点,现总结如下: 1.易错点: ArrayList移除元素后,剩下的元素会立即重排,他的 size() 也会立即减小,在循环过程中容易出错.(拓展:延伸到所有 ...
- Java学习--数组--判断数组中是否包含某个元素的方法
package zaLearnpackage; import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; import ...
- C#遍历集合与移除元素的方法
如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { Li ...
- Java 反射实现实体转Map时,父类元素丢失
public class BeanToMap { public static Map<String, Object> ConvertObjToMap(Object obj) { Map&l ...
- Java Map遍历方式的选择
[原文] 1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keyS ...
- Java Map各遍历方式的性能比较
1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...
- java map遍历方式及效率
本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...
- list的四种遍历方式
1.手先增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容.不能获 ...
- 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法
具体见第三阶段scala-day01中的文档(scala编程基础---基础语法) 1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ...
随机推荐
- CSS规范 - 分类方法
CSS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类. 我们按照CSS的性质和用途,将CSS文件分成“公共型样式”.“特殊型样式”.“皮肤型 ...
- Vagrant 管理部署 VirtualBox (推荐使用)
学习一段时间的大数据和容器技术,使用虚拟机搭建实验环境还是挺耗时耗力的. 一旦虚拟机坏掉了,还要重新开始. 最近发现了Vagrant, 简直好用上天,方便快捷,易用. 下面介绍如何在Windows中安 ...
- Linux学习笔记7
执行脚本篇章 r w x 读 写 执行 4 2 1 如果要启动tomcat 服务器 即执行 startup.sh脚本文件 1> #chmod 444 startup.sh 增加文本读权限 -r ...
- PHP foreach 循环
foreach (array_expression as $value) statementforeach (array_expression as $key => $value) ...
- 图片预览组件PhotoView
图片预览组件PhotoView PhotoView是一款图片预览组件,广泛应用于大图的查看.该组件支持图片手势缩放.旋转等功能.它可以很好的和ViewPager.Picasso等组件结合,实现各种复杂 ...
- Codeforces.1028F.Make Symmetrical(结论 暴力)
题目链接 \(Description\) \(q\)次操作,每次给定点的坐标\((x,y)\),表示加入一个点\((x,y)\),或删除一个点\((x,y)\),或询问:至少需要在平面中加入多少个点, ...
- Ubuntu环境中的Android源代码下载
跟随“老罗的Android之旅”学习Android系统,首先得学会创建能用于编译Android源代码的环境. 文章参考:http://0xcc0xcd.com/p/books/978-7-121-18 ...
- idea中Hibernate反向生成工具
HIbernate反向生成工具 1.使用idea数据库集成工具连接所需数据库 第一步 View-->Tool windows---->Database 第二步 找到所需连接的数据库 第三步 ...
- 使用log
1:下载和安装log4j log4j的官方站点是http://logging.apache.org/log4j/登录此网站即可下载. http://logging.apache.org/log4j/2 ...
- NodeJS Stream流
NodeJS Stream流 流数据在网络通信中至关重要,nodeJS用Stream提供了一个抽象接口,node中有很多对象实现了这个接口,提供统一的操作体验 基本流类型 NodeJS中,Stream ...