在 java 中交换对象或基元是否更昂贵?

Is it more expensive to swap objects or primitives in java?

假设我有一些可比较对象的数组。为方便起见,考虑 Integer。但实际上它可能是一些虚构的数据类型,例如 Car 或 Stuff。进一步说,我需要找到极值。交换指数更便宜吗?对象?或者没关系?换句话说,例子A或例子B更便宜

示例 A

int least = 0;
for(int i=1; i<objects.length;i++)
  if(objects[i].isLessThan(objects[least)) least= i;

示例 B

Stuff least = objects[0];
for(int i=1; i<objects.length;i++)
  if(objects[i].isLessThan(objects[least)) least= objects[i];

在Java中,每个变量要么是原始类型,要么是引用类型(Car类型的变量仅包含对Car实例的引用)。也就是说,所有变量最多为 64 位大,并且可以在单个 cpu 指令中分配。长话短说:没关系。

应该是一样的。如果您没有首先访问 objects[i] 来执行比较,那么由于 CPU 缓存外部的内存访问而引入的延迟可能是一个问题,但由于您已经访问了 objects[i],这不太可能成为问题。

在非常大的数组中,大于缓存的页面大小,交换对象可能会更快,因为您不需要为每次比较检索 objects[least],但这是推测。

java 中的一个引用,如果您要复制一个对象,您将要复制的内容在 32 位机器上是 32 位,在 64 位机器上是 64 位。

另一方面,原始类型取决于哪种类型。例如,一个字节是 8 bits wheras an integer is 32 因此复制一个整数的成本与复制指针的时间一样多(或在 64 位机器上是一半)。

最后,真的 无关紧要,因为您只是复制引用,而不是指向的数据。