关于Linked_List遍历的谜团

时间:2014-12-01 22:35:01

标签: java performance list

答案可能很明显,但我仍然觉得有必要问。 所以我编写了一个简单的Linked_List来进行有趣和训练,并注意到了一种方法 应该打印列表的元素实际上比向后打印列表的方法运行得快。

我一直在考虑解释这个问题的理由,但我一直在圈子里,我很有兴趣知道原因。

这是我的第一个方法(这是简单的遍历列表)


public void list(){
    Node<E> iter = head;
        while(iter != null){
            System.out.print(iter.getValue() + ", ");
            iter = iter.getNext();
        }
}

这是另一种方法,它向后打印列表


public void list_inverse(){
    Node<E> iter = head;
    Stack<Node<E>> stack = new Stack<Node<E>>();
        while(iter != null){
            stack.push(iter);
            iter = iter.getNext();
        }
        while(!stack.isEmpty()){
            Node<E> tmp = stack.peek();
            stack.pop();
            System.out.print(tmp.getValue() + ", ");
        }
}

所以第二种方法的想法是浏览列表并将每个项目添加到堆栈中。 到达最后,我只打印堆栈中包含的元素。 所以你可以看到,第二种方法应该在更长的时间内运行。


在我们的主要方法中:

    long startTime = System.nanoTime();
    list.list();
    long ElapsedTime = System.nanoTime();
    System.out.println();
    long startTime2 = System.nanoTime();
    list.list_inverse();
    long ElapsedTime2 = System.nanoTime();

我的输出:


give the number for the list, if you want to stop, write stop
1
2
3
4
5
6
7
8
9
10
stop

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, //first method
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, // second method

it has taken 8.15E-5 second for list and 5.19E-5 second for list_inverse

1 个答案:

答案 0 :(得分:0)

Java中的Stack在内部使用Vector。由于Vector使用array,它会将元素存储在连续的内存位置。因此,jvm不需要转到引用指向的内存位置来检索值。它可以扫描下一个内存位置并获取值。

我认为这是第一种和第二种方法执行时间不同的主要原因。这是纯粹的猜测; - )