gpt4 book ai didi

java - 为什么 list.size()>0 在 Java 中比 list.isEmpty() 慢?

转载 作者:IT老高 更新时间:2023-10-28 20:35:34 25 4
gpt4 key购买 nike

为什么 list.size()>0 在 Java 中比 list.isEmpty() 慢?换句话说,为什么 isEmpty()size()>0 更可取?

当我查看 ArrayList 中的实现时,看起来速度应该是一样的:

ArrayList.size()

    /**
* Returns the number of elements in this list.
*
* @return the number of elements in this list
*/
public int size() {
return size;
}

ArrayList.isEmpty()

    /**
* Returns <tt>true</tt> if this list contains no elements.
*
* @return <tt>true</tt> if this list contains no elements
*/
public boolean isEmpty() {
return size == 0;
}

如果我们只是编写一个简单的程序来获取这两种方法所花费的时间,那么 size() 在所有情况下都会花费更多 isEmpty(),为什么是这样吗?

这是我的测试代码;

import java.util.List;
import java.util.Vector;

public class Main {
public static void main(String[] args) {
List l=new Vector();
int i=0;
for(i=0;i<10000;i++){
l.add(new Integer(i).toString());
}
System.out.println(i);
Long sTime=System.nanoTime();
l.size();
Long eTime=System.nanoTime();
l.isEmpty();
Long eeTime=System.nanoTime();
System.out.println(eTime-sTime);
System.out.println(eeTime-eTime);
}
}

这里 eTime-sTime>eeTime-eTime 在所有情况下。为什么?

最佳答案

对于 ArrayList,是的 - 你是正确的,操作需要(大致)相同的时间。

对于 List 的其他实现——例如,一个简单的链表*——计算大小可能需要很长时间,而您实际上只关心它是否大于零。

因此,如果您绝对知道列表是 ArrayList 的实现并且永远不会改变,那么这并不重要;但是:

  1. 将自己束缚在特定的实现上是一种糟糕的编程习惯。
  2. 如果代码重组几年后情况发生了变化,测试将表明“它有效”,但运行效率不如以前。
  3. 即使在最好的情况下,size() == 0 仍然不比 isEmpty(),所以没有什么引人注目的使用前者的理由。
  4. isEmpty() 更清晰地定义了您真正关心和正在测试的内容,从而使您的代码更易于理解。

* 我最初在这里编写 LinkedList,隐式引用 java.util.LinkedList,尽管该特定实现确实显式存储了它的大小,使得 size() 成为O(1) 操作在这里。一个简单的链表操作可能不会这样做,并且在更一般的意义上,List 的实现没有效率保证。

关于java - 为什么 list.size()>0 在 Java 中比 list.isEmpty() 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508975/

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