5

以下表达式如何评估?

学生班:

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
    }
}
4

6 回答 6

4

是的,这将起作用它相当于

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

只要 student.id 不是null

于 2011-12-13T11:52:32.740 回答
3

是的,这会起作用,但请注意!

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

studentId == student.getId();

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

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

于 2011-12-13T11:56:11.833 回答
1

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

于 2011-12-13T11:55:38.287 回答
1

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

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

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

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

于 2011-12-13T12:03:54.853 回答
1

比较

studentId==student.getId()

会工作,但会抛出一个NullPointerExceptionif studentis null

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

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

是真的,但是

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

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

于 2011-12-13T12:00:22.020 回答
1

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

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

jls中的相应段落

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

然后§5.1.8 说转换包括拆箱转换。jls中的相应段落

于 2011-12-13T12:02:43.157 回答