对于数组列表,哪个更有效:collections.swap() 或使用临时变量进行交换?

Which is more efficient for array lists: collections.swap() or using a temporary variable to swap?

int temp = name.get(0);
name.set(0, name.get(1));
name.set(1, temp)

Collections.swap(name, 0, 1)

我想交换两个元素,不知道哪个更有效率。两个交换的运行时间似乎相同,但我不太确定。谢谢!

Collections.swap 是:

public static void swap(List<?> list, int i, int j) {
        // instead of using a raw type here, it's possible to capture
        // the wildcard but it will require a call to a supplementary
        // private method
        final List l = list;
        l.set(i, l.set(j, l.get(i)));
}

所以 2 gets 和 2 sets 对比 1 get 和 2 sets。 Collections.swap 也很好地使用了 set 中的 return 值来绕过临时变量的使用。

I want to swap two elements and don't know which is more efficient. It seems like the runtime of both swaps are the same but I'm not too sure.

唯一可以确定的方法是编写正确的 micro-benchmark、运行 它(在许多硬件平台/Java 版本上)并解释结果。

我们可以查看源代码,并做出一些有根据的猜测,但我们无法从第一性原理micro-level推断出效率1.

我的建议:

  • 按照认为最易读的方式编写代码,让编译器进行优化。他们通常可以比大多数程序员做得更好。
  • 如果您担心应用程序的性能,请编写应用程序基准测试并使用分析器找出真正 性能热点所在的位置。
  • 使用热点信息来决定 值得 在 hand-tuning 应用程序中花费精力...而不是您的直觉/猜测。

1 - ...除非这里有人对现实世界 Java JIT 的知识不健康地详细编译器实际上可以跨多个平台工作。如果这里有这样的人,我们应该让他们安静地休息,而不是用这样的问题来打扰他们:-)