How do I copy a stack in Java?

前端 未结 6 650
星月不相逢
星月不相逢 2020-12-03 21:03

I have a stack A and I want to create a stack B that is identical to stack A. I don\'t want stack B to simply be a pointer to A -- I actually want to create a new stack B th

6条回答
  •  北海茫月
    2020-12-03 21:23

    Just use the clone() -method of the Stack-class (it implements Cloneable).

    Here's a simple test-case with JUnit:

    @Test   
    public void test()
    {
        Stack intStack = new Stack();
        for(int i = 0; i < 100; i++)        
        {
            intStack.push(i);
        }
    
        Stack copiedStack = (Stack)intStack.clone();
    
        for(int i = 0; i < 100; i++)            
        {
            Assert.assertEquals(intStack.pop(), copiedStack.pop());
        }
    }
    

    Edit:

    tmsimont: This creates a "unchecked or unsafe operations" warning for me. Any way to do this without generating this problem?

    I at first responded that the warning would be unavoidable, but actually it is avoidable using (wildcard) -typing:

    @Test
    public void test()
    {
        Stack intStack = new Stack();
        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);
        }
    }
    

    Basically I'd say you're still doing an unchecked cast from ? (unknown type) to Integer, but there's no warning. Personally, I'd still prefer to cast directly into Stack and suppress the warning with @SuppressWarnings("unchecked").

提交回复
热议问题