Java中的自动装箱

时间:2011-12-13 11:50:24

标签: java autoboxing

如何评估关注表达式?

学生班:

public class Student
{
    private Integer id;
    // few fields here

    public Integer getId()
    {
        return id;
    }

    public void setId(Integer id)
    {
        this.id=id;
    }

    //setters and getters
}

在某种方法中:

{
    int studentId;

    // few lines here

    if(studentId==student.getId())  // **1. what about auto-unboxing here? Would it compare correctly? I am not sure.**
    {
        //some operation here
    }
}

6 个答案:

答案 0 :(得分:4)

是的,这将有效,相当于

studentId==student.getId().intValue()  

只要student.id不是null

答案 1 :(得分:3)

是的,这会有效,但请注意!

如果Student中的Integer值id为null,则在评估时将出现NullPointerException

studentId == student.getId();

另请注意,自动装箱会产生一些性能成本,因此您只能在必要时使用它。

在此处阅读更多内容:http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

答案 2 :(得分:1)

是的,它会正常工作。但是通常不建议使用包装器类,直到没有其它去。

答案 3 :(得分:1)

比较

studentId==student.getId()

会有效,但如果NullPointerExceptionstudent,则会抛出null

作为一项规则,自动装箱更喜欢原语,即它会尽可能地将Integer转换为int而不是相反。您的示例显示了一个很好的理由,因为参考对象的相等性很棘手。所以有可能:

studentId==student.getId().intValue()  

是真的,但

new Integer(studentId)==student.getId()

是假的,因为虽然它们具有相同的值,但它们不是同一个对象。

答案 4 :(得分:1)

是的,它会起作用,因为它会根据java语言规范将右操作数转换为相应的数字类型:

  

如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。

corresponding paragraph in jls

所以实际上任何操作数都可以是数字类型,以便java自动装配另一个操作数。

然后§5.1.8说转换包括拆箱转换。corresponing paragraph in jls

答案 5 :(得分:1)

根据规范,http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

  

那么什么时候应该使用自动装箱和拆箱?仅在引用类型和基元之间存在“阻抗不匹配”时才使用它们,例如,当您必须将数值放入集合时。将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的。 Integer不能替代int; autoboxing和unboxing模糊了原始类型和引用类型之间的区别,但它们并没有消除它。

使用包装类(Integer等)的唯一可取的情况是,当您想要在集合中粘贴数值时,或者null是您的用例可接受的值。就是这样。

副作用包括不必要的潜在NullPointerException和性能下降。