如何在 Java 中复制堆栈?

2022-09-02 02:34:56

我有一个堆栈 A,我想创建一个与堆栈 A 相同的堆栈 B。我不希望堆栈 B 只是指向 A 的指针 -- 我实际上想要创建一个新的堆栈 B,其中包含与堆栈 A 相同的元素,其顺序与堆栈 A 相同。堆栈 A 是字符串堆栈。

谢谢!


答案 1

只需使用 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);
    }
}

基本上,我会说你仍然在做一个未经检查的转换从(未知类型)到,但没有警告。就个人而言,我仍然更喜欢直接投射到并抑制警告。?IntegerStack<Integer>@SuppressWarnings("unchecked")


答案 2

Stack扩展 ,因此您只需新建一个新的并用于复制项目:VectorStack.addAll(...)

Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);