当多个数据类型存储在ArrayList中时,ArrayList.get()的性能会受到影响吗?

时间:2018-08-15 04:26:44

标签: java arraylist

我正在寻找THIS的答案,该答案是一个流行的Java问题。我知道X数据类型的ArrayList的好处是应该get(5)是瞬时的,因为找到第5个元素只是在实际访问之前要在数组中向前移动5个数据类型单元任何数据。 LinkedList要求访问每个节点的数据以找到下一个节点的位置,并继续此过程,直到到达第5步。因此,在检索数据时ArrayList优于LinkedList的原因。

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

2 个答案:

答案 0 :(得分:3)

经过数小时的搜索,我发现了THIS个问题。它回答了我的问题,但只是部分解决。这个答案是对我的问题的完整答案。

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

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

答案 1 :(得分:1)

考虑到您只能声明使用某种ArrayList(或盒装原语)的Object,而您将get称为按索引-检索元素的时间为O(1),表示它是常量-按索引检索时非常明显。

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