Pra*_*tik 2 java arrays performance arraylist
我正在编写一个程序,它接受400个类型的数字,long并将根据运行时的条件修改其中一些,我想知道是否使用ArrayList<Long>或long[].
哪个会更快使用?我正在考虑使用long[]因为尺寸是固定的.
ami*_*mit 17
当大小固定时,long[]速度更快,但它允许可维护性较差的API,因为它不实现List接口.
注意a long[]更快有两个原因:
longs而不是box对象Long(也可以实现更好的缓存性能,因为longs是有条件分配Long的,并且不保证s)然而,为了更简单的可维护性 - 我会使用a List<Long>,除非性能在程序的这一部分非常关键.
如果你经常在一个紧凑的循环中使用这个集合 - 而你的分析师说它确实是一个瓶颈 - 我会转而更高效long[].
就速度而言,对于400个项目的列表几乎无关紧要.如果你需要动态扩展你的列表,ArrayList<Long>那就更好了; 如果大小是固定的,long[]可能会更好(并且更快一点,但在大多数情况下你可能不会注意到差异).
小智 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 泛型. 但如果你不喜欢它 - 好吧,也许只是使用其他语言;)
| 归档时间: |
|
| 查看次数: |
46409 次 |
| 最近记录: |