答案可能很明显,但我仍然觉得有必要问。 所以我编写了一个简单的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
答案 0 :(得分:0)
Java中的Stack在内部使用Vector
。由于Vector
使用array
,它会将元素存储在连续的内存位置。因此,jvm不需要转到引用指向的内存位置来检索值。它可以扫描下一个内存位置并获取值。
我认为这是第一种和第二种方法执行时间不同的主要原因。这是纯粹的猜测; - )