【问题标题】:Is the performance of ArrayList.get() affected when multiple datatypes are stored in the ArrayList?ArrayList 中存储多种数据类型时,ArrayList.get() 的性能是否会受到影响?
【发布时间】:2019-01-21 23:47:23
【问题描述】:

我正在查看THIS 对一个流行的 Java 问题的回答。我知道 X 数据类型的 ArrayList 的好处是 get(5) 应该是即时的,因为找到第 5 个元素只是在您必须实际访问任何数据之前在数组中向前移动 5 个数据类型单位的问题. LinkedList 需要访问每个节点的数据以查找下一个节点的位置,并继续此过程直到到达第 5 步。这就是为什么 ArrayList 在检索数据方面优于 LinkedList 的原因。

但是,如果数据类型的大小是可变的怎么办?如果我声明一个带有Object 类型参数的 ArrayList,这样我就可以在 ArrayList 中添加一个 char(1 字节)和一个 int(4 字节)怎么办? ArrayList 怎么知道下一个元素在哪里,因为它不能只是向前移动(sizeOfDatatype * steps) 直到它到达它的目标?是否会将数据存储为可用的最大数据类型,例如对齐方式?

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    经过几个小时的搜索,我找到了THIS 问题。它有点回答我的问题,但只是部分回答。这个答案是为了给我的问题提供一个完整的答案。

    ~

    这个问题建立在 ArrayList 存储对象的值(或原始数据类型的值)的错误前提之上。虽然看起来不像,但 ArrayList 不存储值,它们存储对象引用。请注意如何add(int i)add(char c),但不能声明一个带有int 作为类型参数的ArrayList?原因是 ArrayLists 存储对象引用essentially a pointer,并遍历这些指针(所有这些指针都具有相同的大小,因为它们都是指针)。原始数据类型,例如 int,不是引用类型,它们是原始类型,因此不允许作为类型参数。由于Autoboxing,您仍然可以使用int 作为add() 的参数,但这只是为了方便。

    所以不,在 ArrayList 中存储多种数据类型时,get() 的性能不会受到影响,因为您只存储对对象的引用。

    【讨论】:

    • 附带说明,当泛型将来支持原始类型和值类型时,这可能会改变。您可以阅读 JEP here
    • 谢谢@Logan。我可以跟上。基本要点是将来会有一些变化,这意味着类型参数(泛型)不必以 Object 开头,并且自动装箱到您需要的位置,它可以是 getgo 中的原语。我说对了吗?
    • 没错。您将能够使用List<int> 而不是List<Integer>
    • 这个问题的目的是什么,如果你能立即回答:)?另外附带说明:get(int) 中的 int 是列表中的索引位置,因此如果您传递原始 int,则不需要自动装箱。但是,如果你传递一个包装好的 Integer,它会被自动拆箱。
    • @TreffnonX 还是我误解了你?你问我为什么立即回答我的问题?说实话,我几小时前就开始写这个问题了,30 分钟前找到了答案,然后才决定发布它,因为我觉得答案对我来说有点棘手,所以对于其他正在努力解决问题的人来说可能有点棘手同样的问题。
    【解决方案2】:

    考虑到您只能声明一个ArrayList,它采用某种Object(或盒装原语)并且您调用get按索引 - 检索元素的时间是O(1),这意味着它是恒定的 - 在按索引检索时非常明显。

    ArrayList 还实现了RandomAccess 接口,专门表示快速检索。

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 2019-09-02
      • 1970-01-01
      • 2016-08-25
      • 2012-10-18
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多