数组 vs ArrayList:动态使用

4

ArrayList和Vector都在内部使用典型的数组。然而,这让我想...为什么我要使用ArrayList,当我可以使用Arrays实现相同的功能?方便是唯一的原因吗?性能关键的应用程序是否会使用ArrayList?

任何提示将不胜感激。

4个回答

3

我认为相对于“使用数组实现列表”或者“使用数组”,更喜欢使用列表有多个原因,但以下两点最为重要:

  1. 列表对泛型的支持比数组更好(你可以,而且应该,在 Bloch 的 "Effective Java" 中阅读相关内容 - 参见 第25项
  2. 如果你询问使用 ArrayList 还是自己实现 - 我很难相信你会比在 openjdk 中开发它的人做得更好 (Josh Bloch 和 Neal Gafter)。

谢谢你,alfasin。我完全同意你的第二点。但是你能详细说明一下你回答中的第一部分吗?你是说应该使用列表作为替代数组列表吗? - Grateful
@Grateful 不,我不是这个意思。我的意思是应该优先选择List/ArrayList,而不是:1. 数组。2. 自己实现一个List。 - Nir Alfasi
好的。如果我理解有误,请指正,但我认为您基本上是在说ArrayList应该优先于数组。而且,列表作为一个整体(包括ArrayList)比数组更适合用于泛型类型。 - Grateful
@Grateful 是的 - 那正是我所想的。顺便说一句,我们不应该将泛型视为语言的“另一个功能” - 泛型帮助您保持类型安全,这就是为什么鼓励在合适的时候使用它(换句话说:永远不要使用原始类型!)。由于数组是协变且具体化的 - 它们与泛型混合可能会导致不必要的妥协(原始类型...) - Nir Alfasi
非常感谢您的帮助,这对我很有用。 - Grateful
显示剩余2条评论

2

是的,对于性能关键的应用程序来说,它们经常使用ArrayList。在Java中编写的大多数程序中,数组访问很少是主导因素。

ArrayList集合接口比内置原始数组提供了更丰富的功能。通过不必自己编写算法,这些额外的功能将节省您开发时间和调试时间。

此外,许多程序员已经熟悉ArrayList集合接口,因此利用现有的标准库将使您的代码更易于长期阅读和维护。


好的,我确实能看到这种便利性。然而,我仍然在想是否有其他更聪明的替代方案...对于那些对性能至关重要的应用程序,使用看似动态但实际上并不是深层次的东西仍然让我感到困扰。 - Grateful
1
啊?不要试图在没有真正对你的代码进行性能分析的情况下进行关于性能的争论。除非你已经明确表明数组访问是一个关键瓶颈,否则你只会损害代码的维护,并且没有任何实际好处。 - b4hand

0
一个原因是ArrayList的大小是动态的,而数组则不是。

也许我没有表达清楚。我知道ArrayList是“动态”的,但关键是它们在内部使用常规数组来实现这一点。为什么我不能自己模拟这种动态行为呢? - Grateful
没有必要重新发明轮子。 - BlackHatSamurai
2
当然,你总是可以编写自己的ArrayList版本,它在底层使用数组,但这没有意义。这已经被完成了。 - b4hand
好的,我无法反驳这一点...但是是否有其他替代方案呢?Java提供了更好地处理动态数组行为的东西吗? - Grateful
1
不,ArrayList是Java内置的最先进的动态数组集合。 - b4hand

0

ArrayList 的内部实现只是一个数组。但 ArrayList 是一个包装类,它具有更多的功能。如果直接处理数组,则无法使用这些功能。

例如:

如果使用数组,则必须实现逻辑以从数组中删除元素。但是如果使用 ArrayList,则会为您执行删除操作。

将元素添加到数组中: 如果使用数组,则必须实现逻辑。但是使用 ArrayList 则很容易。

在这个 ArrayList 类中,您会发现许多日常使用的便捷方法。

希望这能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接