Java 阵列和ArrayList之间的性能或内存消耗差异

Java 阵列和ArrayList之间的性能或内存消耗差异,java,performance,arraylist,Java,Performance,Arraylist,我发现,与在日常编码中使用数组相比,使用ArrayList几乎可以轻松地做任何事情,而且控制力更强。 因此,我要问: 如果可以使用ArrayList来代替,是否适合避免使用数组 当我用一个数组ArayList 替换一个数组时,需要考虑内存吗? 在具体选择数组和ArrayList时,首先要考虑的是容器的长度是否需要更改。如果有,使用ArrayList,但即使没有,我还是会说应该使用ArrayList。原因是使用ArrayList产生的性能开销通常不足以保证用数组替换它,除非您完全知道性能将是一个问

我发现,与在日常编码中使用数组相比,使用
ArrayList
几乎可以轻松地做任何事情,而且控制力更强。 因此,我要问:

  • 如果可以使用
    ArrayList
    来代替,是否适合避免使用数组
  • 当我用一个<代码>数组ArayList 替换一个数组时,需要考虑内存吗?
    在具体选择数组和ArrayList时,首先要考虑的是容器的长度是否需要更改。如果有,使用ArrayList,但即使没有,我还是会说应该使用ArrayList。原因是使用ArrayList产生的性能开销通常不足以保证用数组替换它,除非您完全知道性能将是一个问题

    一般来说,我认为在大多数情况下,在数组上使用列表是一个更好的主意。由于减少了开销,阵列确实提供了略高的性能。但是,由于列表是一个接口,所以有许多特定的实现(ArrayList、LinkedList等),这为您和客户机代码提供了更大的灵活性

    例如,如果要编写一个执行某些计算并返回列表的方法,那么客户机代码将只能假设返回的列表是根据Java文档中的定义构造的

    例如,在客户端代码中,您可能会发现如下内容:

    List<T> list = foo.getList();
    
    List List=foo.getList();
    

    如果方法getList()当前返回ArrayList,并且您希望更改其行为,使其现在返回LinkedList,您可以这样做,而不用担心破坏使用您的方法的客户端代码,因为它只假设它将接收列表的一些实现,而不是任何特定的实现。

    ArrayList为我们提供了许多在简单数组上不可能实现的功能,我们必须为Arraylist中一步就能完成的事情编写大的方法。 因此,ArrayList需要比简单数组更多的内存消耗,但您可以继续在小程序中使用它,这不会产生太大的影响,但在处理大量数据和性能问题时,如果您可以使用简单数组,请不要使用ArrayList,因为数组速度要快得多

  • 如果我可以在这种情况下使用列表,是否适合避免使用数组

    在某些情况下,您可能希望在列表上使用数组。我建议你学习“大O符号”。另外,请记住,您可以使用列表并通过调用
    yourList.toArray(yourray)
    方法将其转换为数组。您也可以通过使用
    Arrays
    类(
    Arrays.asList(yourray)
    )执行相反的操作。出于显而易见的原因,使用
    列表
    比使用数组更通用,但如果数据集较小,则使用数组可能比使用列表更有效

  • 当我用列表替换数组(使用列表而不是数组)时,是否需要考虑内存方面的一些问题

    您需要记住的最重要的内存考虑是内存分配。创建阵列后,将无法增大或缩小其大小。如果您需要一个1M大小的对象数组(比如100个项目),直到该数组被垃圾回收,您就为该对象(数组)分配了100MB。有了列表,如果你想删除或添加一个项目,你可以很容易地做到;从而减少或增加列表的内存占用


  • 使用一个而不是另一个肯定会影响性能和效率,尽管这对我来说可能很小。而且
    JVM
    的实现影响很大。但是,从
    数组
    添加和获取条目总是比在
    列表
    中快。如果您确定所需的
    数组
    的大小,则在使用数组时可能也会节省很少的内存。 但是,
    List
    在修改内容方面提供了更大的灵活性,基本上有很多方法来操作数据。它完全支持
    泛型

    由于数组是协变的而泛型是不变的,
    数组和泛型不会混合
    ,因此
    Joshua Bloch
    在他的书
    有效Java II
    第25章中建议使用数组之上的列表。我一定会听从他的建议,并建议您也使用列表而不是数组

    当你们说列表时,你们是在谈论列表界面吗?@Kick Buttowski ex:ArrayListPerformance-wise,在数组中添加和检索条目会更快(稍微)。但是,列表提供了更多的方法来操作其内容。此外,正如Joshua Bloch在他的《高效java中所说,他建议使用列表而不是数组,这基本上是因为“数组和泛型不会混合使用”。毫无疑问,我会选择列表。相关:@Jimmy你为什么不回答这个问题?你能更具体地回答wrt
    ArrayList
    ?@OrangeDog你感兴趣的具体细节是什么?如果你对更多“Big-O”信息感兴趣,你可以查看这个小数据集?我有一个大约200行的数据集。你认为它是小的还是大的?在网上搜索基准。谢谢!,我得到了一份有效的Java(第二版),似乎有很多Java知识。非常感谢你的参考。非常欢迎你,这确实是一本很棒的书。