在Java中,我应该使用ArrayList <Long>还是long []?

Pra*_*tik 2 java arrays performance arraylist

我正在编写一个程序,它接受400个类型的数字,long并将根据运行时的条件修改其中一些,我想知道是否使用ArrayList<Long>long[].

哪个会更快使用?我正在考虑使用long[]因为尺寸是固定的.

ami*_*mit 17

当大小固定时,long[]速度更快,但它允许可维护性较差的API,因为它不实现List接口.

注意a long[]更快有两个原因:

  1. 使用原始longs而不是box对象Long(也可以实现更好的缓存性能,因为longs是有条件分配Long的,并且不保证s)
  2. 数组更简单,更有效DS.

然而,为了更简单的可维护性 - 我会使用a List<Long>,除非性能在程序的这一部分非常关键.

如果你经常在一个紧凑的循环中使用这个集合 - 而你的分析师说它确实是一个瓶颈 - 我会转而更高效long[].


das*_*ght 8

就速度而言,对于400个项目的列表几乎无关紧要.如果你需要动态扩展你的列表,ArrayList<Long>那就更好了; 如果大小是固定的,long[]可能会更好(并且更快一点,但在大多数情况下你可能不会注意到差异).

  • 抱歉.之前没有注意到那部分.谢谢.但是,您是如何确定给定数字没有差异的? (2认同)

小智 5

其他答案中没有提到的几件事:

  • 泛型集合实际上是Objects的集合,或者更确切地说,这就是 Java 编译器将对其进行的处理。这是 whilelong[]将永远保持原样。

  • 第一个要点的一个结果是,如果你做了一些最终将其他东西Long放入你的集合中的事情,在某些情况下编译器会让它通过(因为 Java 类型系统是不健全的,即作为一个例子,它允许你向上转换,然后重新转换为完全不同的类型)。

  • 这两者的一个更普遍的结果是 Java 泛型是半生不熟的,在一些不太重要的情况下,例如反射、序列化等,可能会让您“感到惊讶”。事实上,使用普通数组比使用泛型更安全。


package tld.example;

import java.util.List;
import java.util.ArrayList;

class Example {

    static void testArray(long[] longs) {
        System.out.println("testArray");
    }

    static void testGeneric(List<Long> longs) {
        System.out.println("testGeneric");
    }

    @SuppressWarnings("unchecked")
    public static void main(String... arguments) {
        List<Long> fakeLongs = new ArrayList<Long>();
        List<Object> mischiefManaged = (List<Object>)(Object)fakeLongs;
        mischiefManaged.add(new Object());
        // this call succeeds and prints the value.
        // we could sneak in a wrong type into this function
        // and it remained unnoticed
        testGeneric(fakeLongs);

        long[] realLongs = new long[1];
        // this will fail because it is not possible to perform this cast
        // despite the compiler thinks it is.
        Object[] forgedLongs = (Object[])(Object)realLongs;
        forgedLongs[0] = new Object();
        testArray(realLongs);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子有点人为,因为很难想出一个简短的令人信服的例子,但相信我,在不太重要的情况下,当你必须使用反射和不安全的强制转换时,这是很有可能的。

现在,你必须考虑,除了合理之外,还有一个传统。每个社区都有一套自己的习俗和传统。有很多肤浅的信念,例如这里表达的那些,例如。当有人声称实现ListAPI 是无条件的善,如果没有发生,那一定是坏的……这不仅仅是一个主流观点,这是绝大多数 Java 程序员所相信的。 毕竟,它没有没那么重要,Java 作为一门语言还有很多其他的缺点......所以,如果你想确保你的工作面试或只是避免与其他 Java 程序员发生冲突,那么无论出于何种原因,请使用 Java 泛型. 但如果你不喜欢它 - 好吧,也许只是使用其他语言;)