Java:数据结构的内置实现效率低下吗?

时间:2013-01-22 18:41:18

标签: java data-structures

我喜欢使用Java(与C相比)的一个重要原因是有许多可用的内置数据结构(如Collections API)。但是,这些数据结构的实现是次优的吗?为了获得更好的性能,我会更好地编写自己的实现吗?

3 个答案:

答案 0 :(得分:8)

在我遇到具体的性能问题之前,我不会浪费任何时间重新实现Java的Collections库中的任何类。内置类已经过数千人的测试。它们被证明有效,并且它们对大多数一般用例都有效。我发现在大多数情况下,当我发现Collection类的性能问题时,是因为有人为问题选择了错误的数据结构,而不是错误地实现了该数据结构。

答案 1 :(得分:1)

内置的实现非常快(它们在构建时考虑了性能),并且对于绝大多数应用程序来说都足够快。

对于你的情况来说它是否足够快将取决于你的应用程序和硬件,例如,如果你有一个快速的CPU,但内存受限制,反之亦然可以产生巨大的差异。

如果你正在开发需要非常高效的东西,我建议首先创建一个小测试项目,其中包含你需要支持的数据加载和处理级别更有信心,它将足够快地在您的目标硬件上运行。如果不是,您可以调整算法,购买更好的硬件,使用缓存等,或者切换到“更接近金属”的语言。

小心不要陷入优化所有内容的陷阱 - 通常只需要优化应用程序的一小部分。

答案 2 :(得分:-2)

JCF的最大优势在于灵活性,不一定是性能;它有一个很棒的设计,可以让你轻松地从一个集合转换到另一个集合。它具有实用程序类,可以使它们成为线程安全,不可变等。或者您可以实现自己的自定义集合(通过实现接口并使用最近的现有实现进行组合):

public MyList<E> implements List<E> {
    private List<E> holdingList = new ArrayList<E>();

    @Override
    public boolean add(E e) {
        //your custom needs
    }
    //delegate non custom ones to holdingList    
}

如果你真的被性能问题所困扰,那么你可能应该使用好的旧数组,但在大多数情况下,这不一定。

但是你应该了解一下JCF的内部结构,以便从中获得最佳性能;从一个角度来看,他们可能会受到批评,因为他们往往会消耗大量的内存。

一些基本的东西:很高兴知道所使用的排序是合并排序,它对就地排序进行排序,但比快速排序慢一点。您应该预测要使用的集合的大小,并将其作为值传递给构造函数,而不是总是依赖于默认值。另一个重要的事情是选择合适的收藏品;在列表执行时不要使用Map,因为它会占用更多内存。你还应该确保你不会留下无用的空集合,因为它们也会留下记忆。你可以找到一篇关于馆藏和内存使用情况的精彩文章here