如何在 Java 中复制堆栈?
我有一个堆栈 A,我想创建一个与堆栈 A 相同的堆栈 B。我不希望堆栈 B 只是指向 A 的指针 -- 我实际上想要创建一个新的堆栈 B,其中包含与堆栈 A 相同的元素,其顺序与堆栈 A 相同。堆栈 A 是字符串堆栈。
谢谢!
我有一个堆栈 A,我想创建一个与堆栈 A 相同的堆栈 B。我不希望堆栈 B 只是指向 A 的指针 -- 我实际上想要创建一个新的堆栈 B,其中包含与堆栈 A 相同的元素,其顺序与堆栈 A 相同。堆栈 A 是字符串堆栈。
谢谢!
只需使用 Stack-class 的 clone() -方法(它实现了 Cloneable)。
下面是一个 JUnit 的简单测试用例:
@Test
public void test()
{
Stack<Integer> intStack = new Stack<Integer>();
for(int i = 0; i < 100; i++)
{
intStack.push(i);
}
Stack<Integer> copiedStack = (Stack<Integer>)intStack.clone();
for(int i = 0; i < 100; i++)
{
Assert.assertEquals(intStack.pop(), copiedStack.pop());
}
}
编辑:
tmsimont:这为我创建了一个“未检查或不安全的操作”警告。有什么方法可以在不产生此问题的情况下执行此操作吗?
我起初回应说警告是不可避免的,但实际上使用(通配符)键入是可以避免的:<?>
@Test
public void test()
{
Stack<Integer> intStack = new Stack<Integer>();
for(int i = 0; i < 100; i++)
{
intStack.push(i);
}
//No warning
Stack<?> copiedStack = (Stack<?>)intStack.clone();
for(int i = 0; i < 100; i++)
{
Integer value = (Integer)copiedStack.pop(); //Won't cause a warning, no matter to which type you cast (String, Float...), but will throw ClassCastException at runtime if the type is wrong
Assert.assertEquals(intStack.pop(), value);
}
}
基本上,我会说你仍然在做一个未经检查的转换从(未知类型)到,但没有警告。就个人而言,我仍然更喜欢直接投射到并抑制警告。?
Integer
Stack<Integer>
@SuppressWarnings("unchecked")
Stack
扩展 ,因此您只需新建一个新的并用于复制项目:Vector
Stack
.addAll(...)
Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);