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 that contains the same elements as stack A in the same order as stack A. Stack A is a stack of strings.
Thanks!
解决方案
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").