import java.util.Stack;
public class StackIntro {
public static void main(String[] args){
Stack clapper = new Stack();
for( int i=0; i<11; i++){
clapper.push(i);
}
while(!clapper.isEmpty()){
System.out.print ( clapper.pop() ); //FILO
System.out.print ( ',' );
if(clapper.size()==1){
System.out.print(clapper.pop()); //FILO
System.out.println("...");
}
}
System.out.println("Lift-off.");
clapper.removeAllElements();
}
}
所以基本上我只是想看看数字是如何进出堆栈的。 FILO评论显示了这一点。我被告知我应该改变第8行:
clapper.push(i); //previous
clapper.push(new Integer(i)); //new
我不明白这会实现什么,或者两者之间的区别。
答案 0 :(得分:5)
虽然由于自动装箱这两行代码导致Integer
对象的值1
被推入堆栈,但不的两行具有相同的效果
Autoboxing使用Integer 缓存,这是JLS要求-128
到127
的值所需的,因此生成的Integer
实例是<对于该范围内的任何值,em>相同的实例。
但是,每次调用int
构造函数时,都会创建一个 new Integer
实例。
考虑:
Integer a = 1; // autoboxing
Integer b = 1; // autoboxing
System.out.println(a == b); // true
Integer c = new Integer(1);
Integer d = new Integer(1);
System.out.println(c == d); // false
如果在比较推送和弹出堆栈而不是==
的值时使用equals()
(对象标识),则此区别可能会导致程序中出现不同的行为。
答案 1 :(得分:4)
这不会有太大成就,很可能根本没有。
这个想法是clapper.push(T)
接受一个对象,但i
不是一个对象,它是一个原语,所以编译器会在传递它之前自动将它装入Integer
对象到clapper.push()
。
自动装箱从一开始就不是java的一个功能,所以可能仍然存在一些对它感到不舒服的老手。但这应该完全是他们自己的问题。从那以后,Java已经走过了漫长的道路。自动拳击被认为是理所当然的,我们甚至不再考虑任何想法。
传递i
并使编译器自动显示它与传递new Integer(i)
完全相同。