Java中的get()或elementAt()

时间:2011-08-21 21:59:39

标签: java

两者之间的JAVA哪个更快,耗时更少(以纳秒为单位)?

get()elementAt()

我正在使用它们来返回存储在对象中的元素。速度至关重要,因此我想知道哪一个更可行,速度更快。

public E peek() {
        int len = size();
        if (len == 0)
            throw new EmptyStackException();
        return get(len - 1);
}

public E peek() {
            int len = size();
            if (len == 0)
                throw new EmptyStackException();
            return elementAt(len - 1);
}

3 个答案:

答案 0 :(得分:9)

首先,您没有告诉我们您正在使用哪种数据结构。因此,我会假设您使用Vector或某些Vector衍生物。

根据文档,这两种方法是相同的:

http://download.oracle.com/javase/1,5.0/docs/api/java/util/Vector.html

尽管如此,elementAt(idx),可以追溯到Vector没有遵循List模式的日子(通过扩展AbstractList) - 如果你阅读完整的文档,你会看到Vector被修改以实现List接口。

因此,我希望get(idx)能够提供最快的速度,elementAt(idx)只需拨打get(idx)。无论如何,速度上的差异几乎没有 - 如果你想要获得性能提升,你应该去别处看看。

答案 1 :(得分:3)

这是过早优化和微优化的典型例子,它实际上不会优化任何东西。即使方法不同,如果没有在实际负载下对目标硬件进行测量,也无法提前判断出差异。 Java运行时有一种基于实际运行时条件为您优化代码的偷偷摸摸的方式,因此在该细节级别的泛化几乎是无用的。

也就是说,您可能不应该使用'Vector'作为类,因为除非您需要它(是吗?),与'ArrayList'相比,方法级同步会增加(小)开销。 'Vector'自98年以来已经过时了。

经验法则是,“首先使它正确,然后使它快速。”在这种情况下,使用'get()'使其正确,'elementAt()'使它成错。如果您将类型视为“列表”,则不会特别使用“向量”;您可以更自由地更改实现,例如从“ArrayList”到“CopyOnWriteArrayList()”或“LinkedList”,具体取决于程序逻辑的需要。为了得到错误的答案而削减微秒电话或者使用比你有时间开发更好的预先打包解决方案的能力对你没有多大帮助。所以只需使用'get()'。

哦,如果你正在实施'peek()'这是另一个错误。使用类似SDK附带的“Deque”实现之一的API类。 http://download.oracle.com/javase/7/docs/api/java/util/Deque.html

答案 2 :(得分:0)

实现是相同的,至少在OpenJDK 7的源代码中。 两者都返回elementData(index);检查索引是否在边界内。