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

新手上路,请多包涵

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

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

原文由 euphoria83 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 991
2 个回答

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

我个人的意见是你应该使用列表。

我在一个大型代码库上工作,以前的一组开发人员 到处都 使用数组。它使代码非常不灵活。将其中的大部分更改为列表后,我们注意到速度没有差异。

原文由 Fortyrunner 发布,翻译遵循 CC BY-SA 2.5 许可协议

Java 的方式是你应该考虑什么数据 抽象 最适合你的需要。请记住,在 Java 中,列表是抽象的,而不是具体的数据类型。您应该将字符串声明为 List,然后使用 ArrayList 实现对其进行初始化。

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

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

ArrayList 使用数组作为其底层实现来实现 List 抽象数据类型。访问速度实际上与数组相同,具有额外的优势,即能够向 List 添加和减去元素(尽管这是对 ArrayList 的 O(n) 操作)并且如果您决定稍后更改底层实现你可以。例如,如果您意识到需要同步访问,则可以将实现更改为 Vector 而无需重写所有代码。

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

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

在 Java 中,所有集合只存储对对象的引用,而不是对象本身。数组和 ArrayList 都会在一个连续的数组中存储几千个引用,因此它们本质上是相同的。您可以认为由几千个 32 位引用组成的连续块在现代硬件上总是很容易获得。这并不能保证您不会完全耗尽内存,当然,只是连续的内存块要求不难满足。

原文由 cygil 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题