分析轮子(八)- 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): ...
随机推荐
- 【python】TCP/IP编程
No1: [TCP] 客户端 import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('www.sina ...
- 动手创建 SSD 目标检测框架
参考:单发多框检测(SSD) 本文代码被我放置在 Github:https://github.com/XinetAI/CVX/blob/master/app/gluoncvx/ssd.py 关于 SS ...
- 使用pdfBox实现pdf转图片,解决中文方块乱码等问题
一.引入依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox ...
- [OC]时间格式中的字符的意义
Letter Date or Time Component Presentation Examples G Era designator Text AD y Year Year 1996;96 M M ...
- [OC] 使用 cocoaPods 导入 AFNetworking
AFNetworking的GitHub地址: https://github.com/AFNetworking/AFNetworking 假设我们建立了一个叫做AFNWlearning的工程. 1.打开 ...
- inner join 内联与left join 左联
今天老板把我叫过去,给我分析了一下我写的存储过程[捂脸羞愧中...],因为又临时加了个需求需要关联另外一个视图,我写成了内联,所以读取出来的数据少了好多. select t1.MOTCARRIERNA ...
- Java并发编程(十二)-- 阻塞队列
在介绍Java的阻塞队列之前,我们简单介绍一下队列. 队列 队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据,如果你试图向 ...
- Iview-datePicker获取选中的日期,如果没有选,提示错误,选了,错误隐藏
最近遇到大坑,,最后解决了,直接上代码 npm intall iview main.js中引入 import iView from 'iview'; import 'iview/dist/styles ...
- Python中join 和 split详解(推荐)
http://www.jb51.net/article/87700.htm python join 和 split方法简单的说是:join用来连接字符串,split恰好相反,拆分字符串的. .join ...
- assets 与 res 目录的区别
res 目录存放的资源在编译时,会自动生成 R.java,该文件为 res 目录下的资源创建索引,程序可以直接通过 R 资源清单类进行访问,文件assets 目录存放的资源一般是通过 AssetMan ...