当前位置: 首页 > 面试题库 >

为什么不总是在Java中始终使用ArrayList而不是普通的ol'数组?

司马辉
2023-03-14
问题内容

这里的快速问题:为什么不总是在Java中使用ArrayLists?除了额外的有用功能之外,它们显然具有与数组相同的访问速度。我理解它的局限性,因为它不能容纳原语,但是可以通过使用包装程序轻松地减轻这种情况。


问题答案:

如果需要原始类型的集合,那么数组很可能是完成这项工作的最佳工具。装箱是比较昂贵的操作。对于将用作图元的图元集合(不包括地图),我几乎总是使用数组来避免重复装箱和拆箱。

但是,我很少担心数组和的性能差异ArrayList。如果List可以提供更好,更简洁,更可维护的代码,那么除非有一些令人信服的理由,否则我将始终使用List(或,CollectionSet,如适用,但您的问题是关于ArrayList)。性能
很少 是令人信服的原因。

Collection几乎总是使用s会产生更好的代码,部分原因是数组无法与泛型配合使用,正如约翰内斯·魏斯(JohannesWeiß)在评论中已经指出的那样,还有其他许多原因:

  • 集合具有非常丰富的API和各种各样的实现,可以(在大多数情况下)相互轻松地互换
  • 如果 偶尔 使用数组版本很有用,则Collection可以简单地转换为数组
  • 许多Collection的增长比数组的增长更优雅,这可能是性能问题
  • 集合与泛型一起很好地工作,数组表现很差
  • 正如TofuBeer指出的那样,数组协方差很奇怪,并且可以以没有对象会起作用的非预期方式起作用。集合以预期的方式处理协方差。
  • 阵列需要根据其任务手动调整大小,如果阵列未满,则需要自己进行跟踪。如果需要调整阵列的大小,则必须自己进行操作。

所有这些在一起,我很少使用数组,而更多地使用ArrayList。但是,我确实List经常使用s(或just
CollectionSet)。我最常使用的数组是当要存储的项目是基元并且将被插入和访问并用作基元时。如果装箱和拆箱的速度如此之快,以至于成为微不足道的考虑因素,那么我可能会重新考虑这个决定,但是以某种始终引用的形式处理某些东西并将其存储起来更为方便。(即,用“
int”代替“ Integer”。)



 类似资料:
  • 参考Java的Fork/Join vs ExecutorService-何时使用哪个?,传统的线程池通常用于处理许多独立请求;用于处理连贯/递归任务,其中一个任务可能会产生另一个子任务并稍后加入。 那么,为什么Java-8的默认使用而不是传统的执行器? 在许多情况下,我们在或之后使用,然后提交一个函数式接口作为参数。从我的角度来看,这些任务是独立的,不是吗?

  • 问题内容: 我正在查看此代码以Java 进行计算。他们为什么在某些循环中使用十六进制值,而对于变量却使用常规值?使用十六进制有什么好处? 问题答案: 因为十六进制对应的位数比十进制数更紧密。每个十六进制数字对应于4位(半字节)。因此,一旦您了解了与每个十六进制数字(0-F)相关的位掩码,就可以执行“我想要低位字节的掩码”之类的操作: 或者,“我想为低31位使用掩码”: 仅供参考:

  • 问题内容: 许多人和作者建议我们使用列表而不是数组。 它背后的原因是什么? 问题答案: 通常,您应该更喜欢为工作选择正确的数据结构。您需要了解手头的任务以及所有不同的选项,以及它们如何在迭代,搜索,添加,删除和插入数据方面进行比较。通常,您需要了解数据结构如何访问和操作内存,并根据对应用程序的预期使用来选择最佳的数据结构。 显然,它并不总是很明确。但是您可以了解不同数据结构的理想选择。 例如,纯静

  • 问题内容: Java (可能还有许多其他类)内部发生的事情是有一个内部对象,对象被写入其中。每当从元素中读取元素时,都会进行转换。因此,每次读取时都要进行转换。 我不知道为什么要这样做。对我来说,似乎他们只是在做不必要的演员。只创建一个,然后不进行强制转换,是否更合乎逻辑,并且速度稍快一些?每次阵列创建仅一次强制转换,通常 远 少于读取次数。 为什么首选他们的方法?我看不出为什么我的想法并不严格吗

  • 在的情况下,将检索添加的元素。在的情况下,方法调用对所传递的字符串没有影响。JVM到底在做什么?有人能详细解释一下吗?

  • 包中的collections.list()方法返回而不是有充分的理由吗?