==和equals的使用,判断基本变量是否相等,两者运行结果相反?

这究竟是为什么?请求指点,谢谢!
最近刚刚开始学习java,了解到以上两种判断变量是否先等的方式
于是开始以下实验

img


如图:我通过不同类型,不同精度的把3赋值给三个变量,
然后用不同的判断方式对不同组合的变量进行判断
得出的运行结果竟不相同!见下图:

img


我翻阅文档得知equals方法对于基本变量是只判断变量值是否相等结果应该和==的方式一样,但不然。

equals不是这么比较的。
基本数据类型,直接比较的是值,用双等号就可以。
引用数据类型,需要比较值是否相等,才用equals()

img

编译肯定能编译过的。。
你的上面三个变量都是基本类型当你调用Objects.equals把它们当作参数传入时
他们会变成包装类型Integer Float
再去看Object.equals源码

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

实际上它是先比较a,b的地址,不相等的情况下会比较
a.equals(b)
用你的例子就是new Float(a).equals(new Integer(b))
再去看Float.equals()方法

    public boolean equals(Object obj) {
        return (obj instanceof Float)
               && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }

结合instanceof的语义,很容易得出结论false

demo1,demo2,demo3都是基础类型,基础类型可以使用 == 做相等比较。
所以demo1==demo2,demo1==demo3都是true,因为基础类型比较的是数值。
但是注意Objects.equals(Object a, Object b)方法的入参类型,是Object,引用类型。这时候你把demo1,demo3当做入参传给Objects.equals方法时,java自动将demo1,demo3转化成了对应的引用类型,再进行的比较。实际是Float类型与Integer类型做比较,类都不同,equals自然是false。

img

float,int为基本类型,比较的是数值大小,Objects.equal方法参数为Object类,需要将他们转换为对应的对象类型,Float对象之间的比较的方法是根据值做比较,可以看源码Float的equals方法,但是这个equals方法会判断是否为FLoat对象,int的基本类型为Integer,所以他们的equals比较的是Object类提供的equals,那么他们比较的是是否为同一个对象,则为false。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632