gpt4 book ai didi

java - 哪一个是迭代特定集合元素的最佳方式?

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:27 25 4
gpt4 key购买 nike

在遍历特定集合 的元素时,我总是使用for each 循环。

只是为了检查每个循环过程消耗了多少时间,我这样编码,

public class LoopingDemo {
static ArrayList<String> arrayList = new ArrayList<String>();
static double start;
static double end;

public static void iterator() {
simpleForLoop();
System.out.println();
forEachLoop();
System.out.println();
useWhileLoop(arrayList);
System.out.println();
useForLoop(arrayList);
System.out.println();
enumerator();
}
public static void simpleForLoop(){
start = System.nanoTime();
for(int i=0;i<arrayList.size();i++){
String str = arrayList.get(i);
System.out.println(": "+str);
}
end = System.nanoTime();
System.out.println("Taken taken in simpleForLoop process: "
+ (end - start));
}

public static void forEachLoop() {
start = System.nanoTime();
for (String str : arrayList) {
System.out.println(str);
}
end = System.nanoTime();
System.out.println("Taken taken in forEachLoop process: "
+ (end - start));
}

public static void enumerator() {
start = System.nanoTime();

// get the Enumeration object
Enumeration<String> en = Collections.enumeration(arrayList);

// enumerate through the ArrayList elements
System.out.println("Enumerating through Java ArrayList");

while (en.hasMoreElements()) {
System.out.println(en.nextElement());
/*
* String name = (String) en.nextElement();
* System.out.println(name);
*/
}
end = System.nanoTime();
System.out.println("Taken taken in enumeration process: "
+ (end - start));
}

private static void useWhileLoop(Collection<String> myList) {
start = System.nanoTime();
Iterator<String> itr = myList.iterator();
while (itr.hasNext()) {
String str = itr.next(); // Returns the next element in the
// iteration.
System.out.println(str);
// System.out.println(itr.next()); // in one line
}
end = System.nanoTime();
System.out.println("Taken taken in useWhileLoop process: "
+ (end - start));
}

/**
* Note that this for-loop does not use an integer index.
*/
private static void useForLoop(Collection<String> myList) {
start = System.nanoTime();
for (Iterator<String> itr = myList.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}
end = System.nanoTime();
System.out.println("Taken taken in useForLoopWithIterator process: "
+ (end - start));
}

public static void addElements() {

// Add elements to the array list.
arrayList.add("C");
arrayList.add("A");
arrayList.add("E");
arrayList.add("B");
arrayList.add("D");
arrayList.add("F");
arrayList.add(1, "A2");

}

public static void main(String[] args) {
addElements();
iterator();

}

}

令人惊讶的是,通过for each 循环完成的循环过程仅落后于简单的for 循环。(结果可能因具有不同配置的不同机器而异。)

控制台输出:

Taken taken in simpleForLoop process:              853200.0
Taken taken in forEachLoop process: 788993.0
Taken taken in useWhileLoop process: 452014.0
Taken taken in useForLoopWithIterator process: 299775.0
Taken taken in enumeration process: 766756.0

那么为什么人们更喜欢通过 for each 循环来完成它?是否有任何基于性能的原因?

最佳答案

IIRC,for-each 循环只是一个语法糖,在遍历集合时将被编译为带有迭代器的 for 循环。在运行时应该没有性能差异。

您看到的差异是基准测试逻辑编写不当的典型结果。如果你把“for loop with iterator”作为第一个调用的方法,你会发现它运行缓慢。

且不说每次测试的持续时间太短,意义不大,在我添加了一些热身后(先运行所有东西5次,然后看第6次的结果),结果变得正常:

Taken taken in useForLoopWithIterator process: 105110.0
Taken taken in simpleForLoop process: 122181.0
Taken taken in useWhileLoop process: 104774.0
Taken taken in enumeration process: 123520.0
Taken taken in forEachLoop process: 106782.0

forEachloop、useForLoopWithIterator 和 useWhileLoop 的结果几乎相同(它们应该是相同的)。遍历集合时基于索引的访问几乎是最不受欢迎的。虽然这里的差异并不显着,但如果您使用非基于数组的集合,您会看到更大的差异,例如链表。

关于java - 哪一个是迭代特定集合元素的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26455021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com