这究竟是为什么?请求指点,谢谢!
最近刚刚开始学习java,了解到以上两种判断变量是否先等的方式
于是开始以下实验
equals不是这么比较的。
基本数据类型,直接比较的是值,用双等号就可以。
引用数据类型,需要比较值是否相等,才用equals()
编译肯定能编译过的。。
你的上面三个变量都是基本类型当你调用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。
float,int为基本类型,比较的是数值大小,Objects.equal方法参数为Object类,需要将他们转换为对应的对象类型,Float对象之间的比较的方法是根据值做比较,可以看源码Float的equals方法,但是这个equals方法会判断是否为FLoat对象,int的基本类型为Integer,所以他们的equals比较的是Object类提供的equals,那么他们比较的是是否为同一个对象,则为false。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!