kjellkod 的文章中提到,如果我们传入作为参数ArrayList
接收的方法,那么我们会损失性能,因为 ArrayList 实现了额外的RandomAccess接口。文章示例:List
// SLOWER: as shown in http://ideone.com/1wnF1
private static void linearInsertion(Integer[] intArray, List<Integer> list) {
[...]
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
if (integer.compareTo(list.get(i)) >= 0) { // ... more code
// FASTER: as shown in http://ideone.com/JOJ05
private static void linearInsertion(Integer[] intArray, ArrayList<Integer> list) {
[...]
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
if (integer.compareTo(list.get(i)) >= 0) { // ... more code
来自参考:
鼓励通用列表算法在应用算法之前检查给定列表是否是此接口的实例,如果将其应用于顺序访问列表会提供较差的性能,并在必要时更改它们的行为以保证可接受的性能。
但是,如果我们真的在上述方法中传递了 ArrayList 和 check list instanceof RandomAccess
,那么这两种情况都是如此。所以,我的第一个问题是为什么 Java VM 应该将其解释为第一种方法中的顺序列表?
我已经修改了文章中的测试以检查我的机器上的这种行为。在ideone上运行测试时,它显示的结果类似于 kjellkod 的结果。但是当我在本地运行它时,我得到了意想不到的结果,这与文章解释和我的理解相反。在我的例子中,ArrayList as List 迭代似乎比将其引用为 ArrayList 快 5-25%:
如何解释这种差异?它是否取决于架构或处理器内核的数量?我的工作机配置是 Windows 7 Professional x64、Intel Core i5-3470(4 核、4 线程)、16 GB RAM。