分析轮子(八)- 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): ...
随机推荐
- poj 3368 Frequent values(经典)【RMQ】
<题目链接> 题目大意: 给你一个长度为n的序列,这个序列每个数都有一个值,接下来进行q次询问,问在指定区间内出现次数最多的数出现了几次. 解题分析: 因为该序列是非降序的,所以该序列中的 ...
- 003.MongoDB主要概念
一 对比关系 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行 ...
- STRING DELIMITED BY SIZE
The following COBOL program depicts the use of STRING DELIMITED BY SIZE IDENTIFICAT ...
- Alpha(10/10)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- c# 获取键盘的输入
c# 获取键盘的输入 Console 类公开了三个方法获取键盘的输入,分别是Read .Readkey.ReadLine Read方法: 每次只能读入一个字符,如果没有字符可以读,返回-1,Rea ...
- 理解Session缓存
session的缓存有两大作用 (1)减少访问数据库的频率.应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,音系Session的缓存 可以提高数据库访问性能 (2)保证缓存中 ...
- nodejs koa2 框架中,mongoose update一条数据
没有去看update和findOneAndUpdate的区别了,困扰了一晚上的问题,查了下官网,改成这样就好了 await model.user.findOneAndUpdate({ openIds: ...
- BZOJ4738 : 汽水
二分答案$mid$,若存在一条路径满足$|ave-k|<mid$,则答案至多为$mid-1$. 若$ave\leq k$,则$\sum(w-k)\leq 0$,且$\sum(k-w-mid)&l ...
- ES6 迭代器和生成器
设计为了更高效的数据处理,避免过多for循环嵌套(代码复杂度,跟踪多个循环变量) 1. 迭代器: 为迭代过程设计的接口 所有的迭代器对象都有next()方法,每次调用都返回一个结果对象,对象有两个属性 ...
- Android Studio 设置字体
File->Settings->Editor->Colors & Fonts->Font->Editor Font