Java中的数组或列表。哪个更快?

问题

我必须在内存中保留数千个字符串,以便在Java中以串行方式访问。我应该将它们存储在数组中还是应该使用某种List?

由于数组将所有数据保存在连续的内存块中(与Lists不同),使用数组存储数千个字符串会导致问题吗?

**答案:**共识是性能差异很小。 List接口提供更大的灵活性。


#1 热门回答(327 赞)

我建议你使用分析器来测试哪个更快。

我个人认为你应该使用列表。

我在一个大型代码库上工作,而前一组开发人员在处使用了arrays。它使代码非常不灵活。在将大块的大块改为Lists后,我们注意到速度没有差异。


#2 热门回答(150 赞)

Java的方式是你应该考虑哪种数据最适合你的需求。请记住,在Java中,List是一个抽象,而不是具体的数据类型。你应该将字符串声明为List,然后使用ArrayList实现初始化它。

List<String> strings = new ArrayList<String>();

抽象数据类型和具体实现的这种分离是面向对象编程的关键方面之一。

ArrayList使用数组作为其底层实现来实现List Abstract Data Type。访问速度几乎与数组相同,还有一个额外的优点:能够向List添加和减去元素(虽然这是一个带有ArrayList的O(n)操作),如果你决定稍后更改底层实现你可以。例如,如果你意识到需要同步访问,则可以将实现更改为Vector,而无需重写所有代码。

实际上,ArrayList是专门为在大多数情况下替换低级数组构造而设计的。如果今天设计Java,完全有可能完全忽略数组以支持ArrayList结构。

由于数组将所有数据保存在连续的内存块中(与Lists不同),使用数组存储数千个字符串会导致问题吗?

在Java中,所有集合仅存储对象的引用,而不存储对象本身。数组和ArrayList都会在连续数组中存储几千个引用,因此它们基本相同。你可以考虑在现代硬件上始终可以使用几千个32位引用的连续块。这并不能保证你不会完全耗尽内存,当然,只是连续的内存需求块并不难实现。


#3 热门回答(88 赞)

你应该更喜欢泛型类型而不是数组。正如其他人所提到的,数组是不灵活的,并且没有泛型类型的表达能力。 (但它们确实支持运行时类型检查,但是它与泛型类型混合得很厉害。)

但是,与往常一样,在优化时,你应始终遵循以下步骤:

  • 在你拥有一个漂亮,干净且有效的代码版本之前,请不要进行优化。在这一步骤中,很可能会改变通用类型。
  • 如果你的版本很干净,请确定它是否足够快。
  • 如果速度不够快,请测量其性能。这一步很重要,原因有两个。如果你不衡量,你将不会(1)知道你所做的任何优化的影响,以及(2)知道优化的位置。
  • 优化代码中最热门的部分。
  • 再次测量。这和以前测量一样重要。如果优化没有改进,请将其还原。请记住,没有优化的代码是干净,漂亮和有效的。