Dav*_*gan 0 java performance stack arraylist data-structures
我有两个集合 - 一个ArrayList和一个Stack.我使用堆栈因为我需要一些简单的pop/push功能来代替这段代码.ArrayList本质上是out变量,因为这是函数中的一小部分代码.
因此,变量是这样定义的,然后运行代码以向堆栈添加元素.
ArrayList<String> out = new ArrayList<String>();
/* other code.. */
Stack<String> lineStack = new Stack<String>();
/* code that adds stuff to the stack */
Run Code Online (Sandbox Code Playgroud)
问题是,现在我有一个完全填充的堆栈,如何以相反的顺序将它放在out ArrayList中,然后从pop顺序放置.
我的第一个想法是解决方案
while(!lineStack.empty()) {
out.add(0, lineStack.pop());
}
Run Code Online (Sandbox Code Playgroud)
...哪个有效,但我担心在ArrayList的开头添加一个元素的效率(这会强制所有现有元素需要转移..这是一个链表(我相信)..大不了...但仍然在意).此外,我正在通过循环运行...可能不必要.
所以,我的第二个解决方案不涉及循环(至少在我的代码中,我确定后端调用是这样做的).
List l = lineStack.subList(0, lineStack.size());
out.addAll(l);
Run Code Online (Sandbox Code Playgroud)
我知道我不需要分配列表,但它会保留更清晰的代码.但是,我不确定这是否会给我带来特别有用的性能提升.
所以,我的问题是:对于SMALL到MEDIUM尺寸的设置中哪一个最有效?如果有更有效的解决方案,它会是什么?
Jon*_*eet 23
该Iterable<T>实施次序Stack<T>进去你想反正顺序,所以你可以只使用
new ArrayList<String>(stack);
Run Code Online (Sandbox Code Playgroud)
这是一个简短而完整的例子:
import java.util.*;
public class Test
{
public static void main(String[] args)
{
Stack<String> stack = new Stack<String>();
stack.push("Bottom");
stack.push("Middle");
stack.push("Top");
List<String> list = new ArrayList<String>(stack);
for (String x : list)
{
System.out.println(x);
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印出:
Bottom
Middle
Top
Run Code Online (Sandbox Code Playgroud)
(这与你弹出它们时所获得的顺序相反).
编辑:另一个问题 - 你真的需要它ArrayList<String>吗?Stack<T>实施List<T>; ArrayList你需要什么特殊功能?(我不是说你没有需要他们,只是检查!)
| 归档时间: |
|
| 查看次数: |
24520 次 |
| 最近记录: |