何时使用List <long>而不是long []?</long>

时间:2011-03-04 16:11:19

标签: java arrays performance primitive

有一些我真的不明白的东西:很多(请参阅我的评论)人们抱怨Java并不是真正的OO,因为你仍然可以访问原始和原始数组。有些人甚至说这些应该消失......

但是我没有得到它...你能不能有效地完成信号处理(比如写一个FFT,对于初学者来说),编写有效的加密算法,编写快速图像处理库等等,如果你还没有'是否可以访问 int [] long []

我应该使用List&lt; Long&gt;开始编写我的Java软件吗?而不是长[]?

如果答案是“只是使用更高级别的库来做你需要的”(例如,信号处理),那么这些库应该如何编写呢?

4 个答案:

答案 0 :(得分:3)

我个人大多数时候都会使用List,因为它给你带来了很多便利。您还可以拥有并发集合,但不能并发原始数组。

我使用原始数组的唯一情况是我正在读取大量二进制数据,例如图像处理。我担心例如{.1}}对象实例化100M次,但我必须承认我从未尝试过使用那个巨大的Byte列表。我注意到当你有100KB的文件时,Byte可以正常工作。

大多数图像处理示例等也使用数组,因此在此字段中使用原始数组实际上更方便。

总而言之,我对此的实际答案是

除非你是

,否则使用包装
  1. 使用非常大的数组 像长度&gt; 10M(我太懒了 写一个基准!),
  2. 在一个领域工作 许多例子或人们喜欢的地方 原始数组(例如网络 编程,图像处理),
  3. 你发现有重大意义 通过改变原始数组来实现性能提升 实验
  4. 如果有的话 之所以使用raw更容易 这个问题的数组就是你。

答案 1 :(得分:2)

在高性能计算中,对象数组(以及基元)是必不可少的,因为它们更强大地映射到底层CPU架构上,并且对于诸如缓存访问和垃圾收集之类的事情表现得更加可预测。有了这样的技术,Java就被非常成功地应用于那些被认为语言不合适的领域。

但是,如果您的目标仅仅是编写高度可维护且可证明自我一致的代码,那么更高级别的构造是显而易见的方法。在您的直接比较中,List对象隐藏了内存分配问题,增加了列表等,以及提供(在各种实现中)其他工具,如堆栈或队列等特定访问模式。泛型的使用还允许您以更高的置信度和IDE和工具链的全面支持进行重构。

开明的开发人员应该为他们正在接近的用例做出适当的选择。建议一种语言不是“足够OO”,因为它允许这样的选择会让我怀疑这个人要么不相信其他开发人员就像他们那样聪明,要么没有特别广泛的不同应用领域的经验。

答案 2 :(得分:1)

这是一个判断电话,真的。列表倾向于使用通用库更好地运行,并且具有addcontains等内容,而数组通常更快并且具有内置语言支持并且可以用作varargs。选择你认为更适合自己目的的任何东西。

答案 3 :(得分:-1)

好。

您需要在创建数组时知道数组的大小,但在创建数组后无法更改其大小。但是,列表可以在创建后动态增长,并且具有.Add()功能。

您是否通过此链接?

Arrays与List的比较。