如何用Java复制堆栈?

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

谢谢!

只需使用Stack-class的clone()方法(它实现Cloneable)。

这是一个简单的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()); } } 

编辑:

tmsimont:这会为我创建一个“未经检查或不安全的操作”警告。 没有产生这个问题的任何方法吗?

我起初回答说警告是不可避免的,但实际上可以使用 (通配符)-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); } } 

基本上我会说你还在做一个不受限制的演员阵容? (未知类型)到Integer ,但没有警告。 就个人而言,我仍然倾向于直接投射到Stack并使用@SuppressWarnings("unchecked")抑制警告。

Stack扩展了Vector ,所以你可以新建一个新的Stack并使用.addAll(...)来复制这些项目:

 Stack newStack = new Stack(); newStack.addAll(oldStack); 

Stack类是AbstractList的子类。

简单地将其视为AbstractList,使用get(int index)方法迭代堆栈中的元素,从0到列表/堆栈的长度,并将元素添加到新堆栈。

这不会复制元素 – 它会将元素添加到新堆栈中。 如果您还需要复制元素,则需要深入了解其他级别并创建元素的副本,并将这些元素添加到新堆栈中。

您可以使用clone方法执行完整(或“深度”)副本 ,但请注意,该对象必须实现Clonable接口才能获得对象的深层副本 。

您想使用克隆方法。