分析轮子(八)- 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): ...
随机推荐
- Spark-Unit2-Spark交互式命令行与SparkWordCount
一.Spark交互式命令行 启动脚本:spark-shell 先启动spark:./start-all.sh 本地模式启动命令:/bin/spark-shell 集群模式启动命令:/bin/spark ...
- CentOS 通过yum在线安装MySQL5.7
CentOS 通过yum在线安装MySQL5.7 Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysq ...
- ContentProvider插件化解决方案
--摘自<android插件化开发指南> 1.当要传输的数据量大小不超过1M的时候,使用Binder:数据量超过1M时,Binder就搞不定了,需要ContentProvider 2.Co ...
- Java内存管理-掌握自定义类加载器的实现(七)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分析了ClassLoader的类加载相关的核心源码,也简单介绍了ClassLoa ...
- 微信小程序开发指南
https://developers.weixin.qq.com/miniprogram/introduction/#%E4%BA%A7%E5%93%81%E5%AE%9A%E4%BD%8D%E5%8 ...
- php xml格式对象 返回->对应格式数组
/* * $objXml xml格式对象 * 返回 : 对应格式数组 */ public function XmlString2Arr($xml) { ...
- Leetcode 记录(101~200)
Now, I want to just use English to explain the problem, it's about two month before the interview, s ...
- SQL 关联外键报错类型不匹配
如题,关联外键的时候,报错类型匹配.但是两个 类型都是int sql 如下: CREATE TABLE IF NOT EXISTS `alert_receiver_map` ( `id` INT UN ...
- js中call和apply的作用和用法
call和apply的用途是完全一样的.改变函数中this的指向: 为什么要改变this的指向呢?这个有什么用?有哪些场景呢? 首先this的指向总是在变的,this的指向是由函数执行时所在的环境决定 ...
- GMA Round 1 最大值
传送门 最大值 求$f(x)=cos(x)+\sqrt{cos^2(x)-4\sqrt{3}cos(x)+4\sqrt{2}sin(x)+10}$的最大值.保留到小数点后3位. $f(x)+\sqrt ...