在这里使用新的Integer有什么用呢?

时间:2016-10-18 19:41:42

标签: java

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

我不明白这会实现什么,或者两者之间的区别。

2 个答案:

答案 0 :(得分:5)

虽然由于自动装箱这两行代码导致Integer对象的值1被推入堆栈,但的两行具有相同的效果

Autoboxing使用Integer 缓存,这是JLS要求-128127的值所需的,因此生成的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)完全相同。