【问题标题】:how equal operator works with primitive and object type data相等运算符如何处理原始和对象类型数据
【发布时间】:2015-03-19 07:37:41
【问题描述】:

我知道这是一个非常基本的问题,但我想弄清楚这个概念。我想知道== 运算符在原始类型和对象类型的情况下如何工作。例如

Integer a = 1;
int b = 1;
System.out.println(a == b)

a 如何与b 进行比较,而a 包含包含值 1 的对象的引用。有人可以向我解释一下它是如何在内部工作的吗?

【问题讨论】:

标签: java equality unboxing


【解决方案1】:

一般来说,Java 中的相等运算符执行所谓的浅比较。换句话说,它比较变量包含的值。现在原始数据类型的变量包含值本身,而引用类型包含对存储实际内容的堆区域的引用。这意味着在您的代码中 sn-p int b 将保存值 1Integer a 将保存堆上实际 Integer 对象的内存地址。

现在,在您提供的特定示例中,有一个特点。 Integer 类是包装原始整数类型的特殊包装类。编译器可以自动在此类包装对象和原始类型之间进行转换(称为装箱和拆箱)。

让我们一步一步地告诉你代码,让你清楚。

Integer a = 1;

编译器实际上替换了这一行的以下代码:

Integer a = Integer.valueOf(1);

静态方法valueOf 返回一个包装对象实例,该实例包装提供的原始值。当编译器从原始类型构造包装类时,这个过程称为装箱。

当使用这样的包装对象时,使用相等运算符将其与原始变量进行比较

a == b

编译器实际上将其更改为以下内容:

a.intValue() == b;

其中intValue 返回由包装器对象包装的原始值(称为拆箱),即它拆箱原始值并使表达式等效于比较两个原始值。这就是为什么相等运算符然后返回true

【讨论】:

    【解决方案2】:

    在您的特定示例中,装箱类型 Integer 将被拆箱为原始类型 int,== 将比较原始类型(即在您的情况下为 true)。

    【讨论】:

    • 这意味着首先发生自动拆箱,然后在内存中比较实际值 ((autounboxing)obj == val) 而不是 ref == val。如果我的理解有误,请纠正我。
    • 不确定我是否理解您的评论,但这里是拆箱转换的规范:docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.8
    • 是的,包装对象与原始类型的比较会导致拆箱,因此您最终会比较两个原始值,请参阅我的回答
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2017-12-28
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多