繁体   English   中英

值比较与对象引用比较

[英]Value comparison vs. Object reference comparison

请有人向我解释,为什么答案是对与错

public class IntegerTest {

        public static void main(String[] args) {

            Integer x = 1000;
            long y = 1000;
            Integer z = 1000;
            System.out.println(x == y);
            System.out.println(x == z);

        }
    }

x == y是一个值比较(因为y是原始类型),所以1000 == 1000-> true

x == z是对象引用比较-对象x不是对象z 它们具有相同的值,但是它们仍然是两个完全不同的对象。 因此,如果将它们进行比较,则会得出false

JLS第5.1.7节中的装箱和拆箱转换。

这与Java具有基本类型(例如int)和引用类型(例如Integer)有关。

当将引用类型与原始类型进行比较时,会将引用类型的实际值与原始类型的值进行比较。 但是,当比较两个引用类型时,将比较引用本身而不是值。

System.out.println(x == y);//this will compare referance
System.out.println(x == z);//this will compare value

参考是不同的,值是相同的,所以它给出了这样的操作

您可能想阅读自动装箱和拆箱

第一个是正确的,因为它的值完全相同。 没错吧? 第二个错误,因为long是一个浮点值1000.0。 因此,如果您将浮点值与整数进行比较,则需要添加类型强制转换或使用compareTo()

希望能有所帮助

检查两个操作数的值是否相等,如果是,则条件为真。 平等测试操作员==,!=

==运算符测试两个值是否相同,因此如果x包含值6,则(x == 6)为true。非等于运算符!=相反,如果值不同,则评估为true。 通常,对int和boolean这样的基元使用==和!=,而不对String和Color这样的对象使用==和!=。 对于对象,最常见的是使用equals()方法测试两个对象是否表示相同的值。

==和.equals()的相似性可能会令人困惑,因此这是一条建议的规则:Java中的每个值都是原始值(例如int)或对象(例如String)。 将==,<,> =等用于原语(例如int)。 将.equals()与String和Color等对象一起使用。 由于取消引用点(。)仅适用于对象,因此您可以这样记住:如果可以带点,则使用.equals()(例如String),否则使用==(例如int)。

也可以将==与对象一起使用。 在这种情况下,==的作用是测试两个指针是否指向完全相同的对象。 例如,在Java代码中很少使用==,因此,将精力集中于对等对象使用equals()和仅对基元使用==更为简单。

当您要求Java比较x == y时,您要求Java将Integer(类)与1000(long,这是基本类型)进行比较。 在这种情况下,Java将自动取消对x的装箱并尝试比较这些值。

但是,当您尝试比较两个类(甚至两个Integer)时,Java将比较地址,这将是错误的。

Integer是包装器类型,它是与基本类型int相关联的Object类型,因此,尽管它是对象类型,但可以充当基本类型。 当使用==与原始类型进行比较时,Integer对象的行为类似于原始类型,并且比较变量x和y的值并返回true。 与另一个对象进行比较时,我们使用==询问两个对象是否相同,即相等。 如果整数对象的值相等,则它们相等。可以使用.equals()进行检查。 因此x.equals(z)是正确的。 但是x和z不相同,如果我们更改z的值,则x的值保持不变,它们是不同的对象,因此x==z为假。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM