java - Java 的 LinkedList 是否优化为在必要时反向执行 get(index)?

标签 java performance data-structures linked-list

我一直在研究一些优化 LinkedList 的方法。有谁知道 Java 默认的双向链接 LinkedList 类是否经过优化以反向执行 get() 操作? 例如:

// Some LinkedList list that exists with n elements;
int half = list.size() / 2;
list.get(half + 1);

调用 list.get(half + 1) 是否会优化搜索并反向进行,因为它是一个双向链表?如果您知道该元素位于列表的后半部分,那么从末尾开始搜索并向中心搜索会更有意义。

我知道使用 get(index)O(n) 时间,并且在遍历 LinkedList 时应该使用迭代器,但我只是好奇。

最佳答案

是的。可以自己查看源码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/LinkedList.java#LinkedList.entry%28int%29

LinkedList#get(int) 实现为

return entry(index).element;

其中 entry 是私有(private)方法。 entry的定义是:

private Entry<E> entry(int index) {
    if (index < 0 || index >= size)
        throw new IndexOutOfBoundsException("Index: "+index+
                                            ", Size: "+size);
    Entry<E> e = header;
    if (index < (size >> 1)) {
        for (int i = 0; i <= index; i++)
            e = e.next;
    } else {
        for (int i = size; i > index; i--)
            e = e.previous;
    }
    return e;
}

如您所见,如果索引大于列表的中点,它会从末尾倒数。

关于java - Java 的 LinkedList 是否优化为在必要时反向执行 get(index)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151841/

相关文章:

java - 如果 kafka 消费者指定的偏移量不存在于 Broker 中,会发生什么情况?

c++ - 代码性能严格测量

java - 如何在方法之间正确传递数组

java - 重构泛型

java.lang.ClassNotFoundException : org. springframework.boot.SpringApplication Maven

在 where 子句中使用 case 语句时 Oracle 存储过程不使用索引

mysql - WordPress 在发布和发布元插入/更新/删除期间是否锁定表?

java - 属性文件中的映射数据

c++ - 如何使用递归反转打印堆栈?

Java 对象与对象数组