当前位置: 首页 > 面试题库 >

Java的LinkedList是否经过优化以在必要时反向执行get(index)?

太叔小云
2023-03-14
问题内容

我一直在研究优化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私有方法在哪里。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;
}

如您所见,如果index大于列表的中点,则从末尾开始递减计数。



 类似资料:
  • 我大致了解了TensorFlow图在评估它包含的之一时是如何评估的:该张量的或的执行将触发图中所需的所有级联计算计算该张量的值,因此,图中“导致它”的任何张量也将被计算,并且连接它们的任何操作都将被运行。 因此,如果我有一个包含张量out\u a的图,其计算涉及(可能在许多其他事情中)使用int\u b的操作,这反过来(最终)需要执行本身(最终)使用in的操作 将只评估、和一次:和的计算都使用的相

  • 问题内容: Java编译器(尤其是Profile-guided优化)已淘汰了许多性能技巧。例如,这些平台提供的优化可以大大地(根据源代码)降低虚拟函数调用的成本。VM还能够进行方法内联,循环展开等。 您还采用了哪些其他性能优化技术,但是实际上在更现代的JVM中发现的优化机制已使这些技术过时了吗? 问题答案: 方法和方法参数上的最终修饰符根本无法改善性能。 另外,Java HotSpot Wiki

  • 问题内容: 我能够序列化和反序列化一个类层次结构,其中抽象基类用 但是没有列出子类,并且子类本身是相对未注释的,仅在构造函数上具有a 。ObjectMapper是香草的,我没有使用mixin。 Jackson关于PolymorphicDeserialization和“ type id”的 文档建议(强烈)我需要在抽象基类上使用批注,或者在mixin上使用它,或者需要在ObjectMapper中注册

  • 我使用线程池执行器,将其替换为旧版线程。 我创建了如下执行器: 这里的核心大小是maxpoolsize/5。我已经在应用程序启动时预先启动了所有核心线程,大约160个线程。 在传统设计中,我们创建并启动了大约670个线程。 但关键是,即使在使用Executor并创建和替换遗留设计之后,我们也不会得到更好的结果。 对于结果内存管理,我们使用Top命令来查看内存使用情况。对于时间,我们将System.

  • 我在声纳中发现了一条规则,它说: 与其他中间流操作的一个关键区别是,为了优化目的,流实现可以跳过对< code>peek()的调用。这可能会导致< code>peek()仅针对流中的某些元素或不针对流中的任何元素被意外调用。 另外,Javadoc中提到了它,它说: 此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这种情况下可以跳过吗?和调试有关吗?

  • 我正在尝试使用GSON反序列化JSON数组。我的所有嵌套对象都嵌入到“嵌入”对象中。 我也可能遇到这样的情况: 这是一个极其简单的例子。我的一些对象可能嵌套了2或3层深,并且都在一个“嵌入式”对象中。此外,每个对象在“链接”对象内都有一个嵌套的“网址”。我有大约20个不同的模型对象,每个都有几个字段,每个都有“嵌入”对象。我开始为每个模型编写自定义反序列化器,但这似乎忽略了使用gson的全部意义,