remove(int index)LinkedList自我实现

时间:2014-05-07 03:33:31

标签: java linked-list doubly-linked-list

我正在尝试与ArrayList相比学习LinkedList的性能 我已经按照以下方式制作了删除方法

数据在LinkedList中,被删除的是大约1百万个元素。 我的问题,删除所有项目后:这是Time Recd。 如果我使用Java LinkedList删除(int index)时间:2000纳秒 如果我使用我的自定义删除(int index)时间:34407000纳秒

有人可以看看我的代码并告诉我哪里出错了。我实际上是想通过索引位置删除数据,因为我试图获得的比较是通过ArrayList的索引位置。

public Object remove(int index)
{
    checkElementIndex(index);
    return unlink(getNode(index));
}

private Object unlink(ListNode node)
{
    final Object element = node.item;
    final ListNode next = node.next;
    final ListNode prev = node.prev;

    if (prev == null)
    {
        first = next;
    } else
    {
        prev.next = next;
        node.prev = null;
    }

    if (next == null)
    {
        last = prev;
    } else
    {
        next.prev = prev;
        node.next = null;
    }

    node.item = null;
    size--;
    return element;
}

private ListNode getNode(int index)
{
    if (index < (size >> 1))
    {
        ListNode node = first;
        for (int i = 0; i < index; i++)
        {
            node = node.next;
        }
        return node;
    } else
    {
        ListNode node = last;
        for (int i = size - 1; i > index; i--)
        {
            node = node.prev;
        }
        return node;
    }
}

private void checkElementIndex(int index)
{
    if (index < 0 || index >= size)
    {
        throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
    }
}

    // BOTH THE LIST CONTAIN 1million items.

    startTime = System.nanoTime();
    for (int i = linkedList.size()-1; i >= 0; i--)
    {
        linkedList.remove(i);
    }
    endTime = System.nanoTime();
    duration = endTime - startTime;
    System.out.println("LinkedList Removal Time:  " + duration);

    // This is the Java Collection LinkedList
    startTime = System.nanoTime();
    for (int i = linkedList.size()-1; i >= 0; i--)
    {
        javaLinkedList.remove(i);

    }
    endTime = System.nanoTime();
    duration = endTime - startTime;
    System.out.println("My Removal Time:  " + duration);

我很感激,每一个可能的建议。谢谢。

1 个答案:

答案 0 :(得分:0)

(继续评论)

没问题!第一步是下载一个探查器(我使用VisualVM。还有其他的,但不幸的是我不熟悉它们......)一旦下载了,请继续开火起来。

下一步是弄清楚如何将探查器附加到您的流程。启动VisualVM后,您应该会在右侧看到正在运行的Java程序列表。你现在可以忽略它。诀窍在于,您需要一个长时间运行的程序才能有足够的时间将探查器附加到进程。对于类似代码的东西,更简单的方法是使用Scanner.nextLine()来阻止循环之间的程序,如下所示:

Scanner scanner = new Scanner(System.in);
scanner.nextLine(); // This stops the program and waits for user input.
                    // This will give us all the time in the world to attach the profiler.

// Your code
for (int i = linkedList.size()-1; i >= 0; i--)
{
    linkedList.remove(i);
}

scanner.nextLine(); // Same thing here
for (int i = linkedList.size()-1; i >= 0; i--)
{
    javaLinkedList.remove(i);
}

现在,继续开始您的计划。如果你回到VisualVM,你应该能够看到你的程序!

现在双击你的程序。您应该在程序的控制台中看到一些消息,并且VisualVM中的视图应该更改。转到&#34;采样器&#34;选项卡,单击&#34; CPU&#34;,然后返回到您的程序并按Enter键。

你看到的应该是非常明显的。左侧是包含+ class的完全限定方法名称,以及表示方法使用的CPU时间部分的条形图。用它来确定您的程序在所有时间花费的位置。你去吧!如果您需要更多时间进行分析,只需在链接列表中添加更多元素即可。

但是要小心谨慎;分析可以欺骗,因为如果另一种方法搞乱你的链表结构,它可以使一个非常好的方法工作比它更难。例如,我必须实施HashMap作为学校作业的一部分。当我描述时,我注意到在桶中查看的代码占用了97%以上的CPU时间,即使它没有任何问题。事实证明,获得正确存储桶的测试包含>>而不是<<,而是将HashMap转换为LinkedList!因此,虽然分析是一个良好的开端(并且通常是您需要做的唯一确定问题的事情),但请记住,错误可能在其他地方。

我希望这有帮助!