文档章节

java关于for,foreach,iterator循环ArrayList的方式测试

i
 it_haha
发布于 2016/04/21 15:53
字数 370
阅读 71
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

直接上例子:

package com.test.collections.list;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 
 * ArrayList测试类
 * @author work
 *
 */
public class TestArraryList{
	
	private static ArrayList<String> strs = new ArrayList<String>();
	/**
	 * 赋值操作
	 * @param arrays 数组
	 */
	private static void setValue(String[] arrays){
		strs.toArray(arrays);
	}
	/**
	 *  获得ArrayList的值
	 */
	public static void foreachValue(){
		long start = System.currentTimeMillis();
		for (String str : strs) {
			//System.out.println("foreach value : "+ str);
		}
		long end = System.currentTimeMillis();
		System.out.println("foreachValue 耗时 :" + (end-start));
	}
	/**
	 * 赋值操作
	 */
	private static void setValue(){
		for(int i=0; i<10000000; i++){
			strs.add("strs"+i);
		}
	}
	
	private static void iterValue(){
		long start = System.currentTimeMillis();
		for (Iterator<String> iterator = strs.iterator(); iterator.hasNext();) {
			String str = (String) iterator.next();
			//System.out.println(" iterator value "+ str);
		}
		long end = System.currentTimeMillis();
		System.out.println(" ArrayList iterValue 耗时 :" + (end-start));
	}
	
	private static void forValue(){
		long start = System.currentTimeMillis();
		for (int i = 0; i < strs.size(); i++) {
			strs.get(i);
		}
		long end = System.currentTimeMillis();
		System.out.println(" ArrayList forValue 耗时 :" + (end-start));
	}

	public static void main(String[] args){
		setValue();
		foreachValue();
		iterValue();
		forValue();
		
	}
	

}

运行结果:

 ArrayList foreachValue 耗时 :52

 ArrayList iterValue 耗时 :52

 ArrayList forValue 耗时 :3

结果显示foreach是耗时最久的,产生这种情况的原因是什么呢?

ArrayList:List接口大小可变的数组的实现,这是问题的根本原因,因为是数组,所以直接使用for的时候是最快了,而使用foreach或者iterator的时候都是通过指针来寻找数据,因此会慢一些,而foreach和iterator的效率差不多,foreach稍微慢一点,是因为foreach也是通过最终调用iterator.next()来实现的,因此会比较慢一点!!!


© 著作权归作者所有

i
粉丝 0
博文 7
码字总数 3754
作品 0
东城
私信 提问
加载中

评论(3)

i
it_haha 博主

引用来自“asfdasdfasf”的评论

for (int i = 0; i < strs.size(); i++) {

}
==================
你这里都没有操作strs 除了读取一次长度之外而已啊
就是说读取长度的操作当然比读取所有元素快啊
这能比较么
谢谢你,让我发现了这个问题!!!但是结果是一样的!!!
i
it_haha 博主

引用来自“asfdasdfasf”的评论

for (int i = 0; i < strs.size(); i++) {

}
==================
你这里都没有操作strs 除了读取一次长度之外而已啊
就是说读取长度的操作当然比读取所有元素快啊
这能比较么
package com.test.collections.list; import java.util.ArrayList; import java.util.Iterator; /** * * ArrayList测试类 * @author work * */ public class TestArraryList{ private static ArrayList strs = new ArrayList(); /** * 赋值操作 * @param arrays 数组 */ private static void setValue(String[] arrays){ strs.toArray(arrays); } /** * 赋值操作 */ private static void setValue(){ for(int i=0; i<10000000; i++){ strs.add("strs"+i); } } private static void iterValue(){ long start = System.currentTimeMillis(); for (Iterator iterator = strs.iterator(); iterator.hasNext();) { String str = (String) iterator.next(); //System.out.println(" iterator value "+ str); } long end = System.currentTimeMillis(); System.out.println(" ArrayList iterValue 耗时 :" + (end-start)); } private static void forValue(){ long start = System.currentTimeMillis(); for (int i = 0; i < strs.size(); i++) { strs.get(i); } long end = System.currentTimeMillis(); System.out.println(" ArrayList forValue 耗时 :" + (end-start)); } public static void main(String[] args){ setValue(); iterValue(); forValue(); } } 结果也是一样的
不静知心
不静知心
for (int i = 0; i < strs.size(); i++) {

}
==================
你这里都没有操作strs 除了读取一次长度之外而已啊
就是说读取长度的操作当然比读取所有元素快啊
这能比较么
ArrayList和LinkedList的几种循环遍历方式及性能对比分析

最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据Arr...

Trinea
2013/10/31
654
1
Java集合源码分析之Iterable概述_一点课堂(多岸学院)

前言 当我们想要遍历集合时,Java为我们提供了多种选择,通常有以下三种写法: 写法1:for循环 写法2:foreach循环 写法3:Iterator 那么以上三种遍历方式有何区别呢?for循环我们很熟悉了,...

程伟鑫
09/10
30
0
Java中迭代列表中数据时几种循环写法的效率比较

Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较。虽然网上已经有了类似的文章,但是对他们的结论并不认同。 常见的实现方法: 1.for循环: [java] view plain co...

EDIAGD
2013/09/26
163
0
每周10道Java面试题:集合类

本文作者:ImportNew -唐尤华 未经许可,禁止转载! 每周10道 Java 面试题由 ImportNew 整理编译自网络。 面试题答案讨论请移步:https://github.com/jobbole/java-interview/issues/1 Java...

ImportNew
01/01
0
0
为什么阿里禁止在 foreach 循环里进行元素的 remove/add 操作

在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考。 1.foreach循环 foreach循环(Foreach loop)是计算机编程语言中的一种...

架构师springboot
05/10
72
2

没有更多内容

加载失败,请刷新页面

加载更多

Redis面试题详解:哨兵+复制+事务+集群+持久化等

Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 Sentinel...

Java阿七
2分钟前
0
0
响应国家号召 1+X 证书 Web 前端开发考试模拟题

官方QQ群:736413913 1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http://blog.zh66.club/index.php/...

张帅个人博客
6分钟前
2
0
如何检查一个字符串在Objective-C中是否包含另一个字符串?

如何检查字符串( NSString )是否包含另一个较小的字符串? 我希望有这样的东西: NSString *string = @"hello bla bla";NSLog(@"%d",[string containsSubstring:@"hello"]); 但是我能找到......

javail
23分钟前
2
0
.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏

目 录 1. 概述... 2 2. 演示信息... 2 3. 简单介绍... 3 4. 产品特点... 4 5. 价值体现... 5 1. 概述 经过一段时间的努力,iNeuDA产品组件已经开发和测试完成,现在正式上线。现在iNeuOS工业...

wxzz
25分钟前
2
0
在每个GROUP BY组中选择第一行?

顾名思义,我想选择以GROUP BY分组的每组行的第一行。 具体来说,如果我有一个如下的purchases表: SELECT * FROM purchases; 我的输出: id | customer | total---+----------+------ 1...

技术盛宴
39分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部