Java 对象数组 - 使用硬件内存缓存

Java object arrays - use of hardware memory cache

迭代数组的连续元素通常被认为比迭代连续的链表元素更有效,因为缓存。

只要元素具有基本数据类型,这无疑是正确的。但是如果元素是对象,我的理解是只有对对象的引用才会存储在数组的连续内存区域(很可能被缓存),而实际的对象数据将存储在主内存中的任何位置并且不能被有效地缓存。

由于您通常不仅要遍历容器而且还需要在每次迭代中访问对象数据,这不会或多或少地破坏数组相对于列表的性能优势吗?

编辑:关于不同场景差异很大的评论可能是正确的。那么让我们考虑一个具体的例子:您在容器中搜索一个特定的对象。为了找到它,您需要将给定字符串与另一个字符串进行比较,该字符串是对象的 class 变量。

不,对于对象 ("pointers") 两者都有一个间接。链表需要每个节点都进入下一个节点。所以它仍然有开销。

但是,是的,相对而言,增益只涉及一部分,非常大致是纯遍历的一半,计算间接步骤。

当然,每个间接访问都会使访问变得更混乱、更慢。

顺便说一句,ArrayList 也和数组一样快。