Java 中的数组或列表。哪个更快?
我必须在内存中保留数千个字符串才能在Java中串行访问。我应该将它们存储在数组中还是应该使用某种列表?
由于数组将所有数据保存在连续的内存块中(与Lists不同),因此使用数组来存储数千个字符串是否会导致问题?
我必须在内存中保留数千个字符串才能在Java中串行访问。我应该将它们存储在数组中还是应该使用某种列表?
由于数组将所有数据保存在连续的内存块中(与Lists不同),因此使用数组来存储数千个字符串是否会导致问题?
我建议您使用探查器来测试哪个更快。
我个人的意见是你应该使用列表。
我在一个大型代码库上工作,之前的一组开发人员到处都使用数组。它使代码非常不灵活。在将其中的大块更改为列表后,我们注意到速度没有差异。
Java的方法是,您应该考虑哪种数据抽象最适合您的需求。请记住,在Java中,列表是一种抽象的,而不是具体的数据类型。应将字符串声明为 List,然后使用 ArrayList 实现对其进行初始化。
List<String> strings = new ArrayList<String>();
抽象数据类型和特定实现的这种分离是面向对象编程的关键方面之一。
ArrayList 使用数组作为其基础实现来实现 List 抽象数据类型。访问速度实际上与数组相同,具有能够向 List 添加和减去元素的其他优点(尽管这是使用 ArrayList 的 O(n) 操作),并且如果您决定稍后更改基础实现,则可以这样做。例如,如果您意识到需要同步访问,则可以将实现更改为Vector,而无需重写所有代码。
事实上,ArrayList 是专门为在大多数上下文中替换低级数组构造而设计的。如果Java是今天设计的,那么数组完全有可能被完全排除在外,转而支持ArrayList结构。
由于数组将所有数据保存在连续的内存块中(与Lists不同),因此使用数组来存储数千个字符串是否会导致问题?
在 Java 中,所有集合仅存储对对象的引用,而不存储对象本身。数组和 ArrayList 都将在连续数组中存储几千个引用,因此它们本质上是相同的。您可以考虑,在现代硬件上,几千个 32 位引用的连续块将始终可用。当然,这并不能保证您不会完全耗尽内存,只是连续的内存块要求不难解决。