java中equals()和等值比较

xiaoxiao2021-02-28  115

在java中,当我们判断变量是否相等时,有两种方式,一种是 等值比较(==),一种是调用equals()方法。

1.等值比较(==) 使用格式: A == B。

基本类型:==比较的是值是否相同 引用类型:==比较的是地址值是否相同

注意事项:等号两边的数据类型应该要一致。这种一致指的是这两个变量是要可以互相转化的。例如:

> public class compareTest { > public static void main(String[] args) { > int i = 123; int i1 = 12; char i2 = 'c'; String s = "compare"; Integer i4= 12; System.out.println(i == i1); > System.out.println(i1 == i2); System.out.println(i1 == s;); //编译报错 System.out.println(i1 == i4); System.out.println(i2 == i4); } }

因为基本数据类型之间,存在“自动类型转换”,也叫隐式类型转换

隐式类型转换:有多种类型的数据混合运算时,系统首先自动的 将所有数据转换成 容量最大的那一 种数据类型,然后进行计算自动转换规则。

所以int、byte、float、double、short、long、char 之间是可以直接用等值比较而编译不会报错。 而Integer是引用类型,但是由于Integer的自动拆箱自动装箱特性,所以也可以和基本数据类型用等值比较。

2.equals() 格式:A.equals(B) *注意事项:*equals()要特别注意A不能为null,否则会产生空指针异常。

equals方法是在Object类中定义的。源码如下:

public boolean equals(Object obj) { return (this == obj); }

也就是说, 当一个类没有重写equals()的时候,默认使用的是Object类的equals方法,这个时候,使用equals()和使用等值比较得出的结果都是一样的。 Java中有有一些类重写了equals方法,比如String类、封装类、Math类等。拿Integer类举例。 Integer类重写了equals() API中Integer类中对此方法的描述是: 比较此对象与指定对象。当且仅当参数不为 null,并且是一个与该对象包含相同 int 值的 Integer 对象时,结果为 true。

public static void main(String[] args) { Integer i1 = 127; Integer i2 = 127; Integer i3 = 128; Integer i4 = 128; System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.println(i3 == i4); System.out.println(i3.equals(i4)); }

值得注意的一点是Integer的一点特殊性,在本例中,输出结果为

true true false true

因为Integer类针对-128~127之间的数据做了一个缓冲池,也就是说,Integer类型的-128~127的数值是存储在方法区的常量池中的。 i1和i2指向的都是常量池中的127,所以i1==i2的结果是true。 超过这个数值的Integer变量,将会在堆中重新开辟空间,所以i3和i4指向的不是同一个对象,也就是说其地址值是不同的,所以i3==i4的输出结果是false。

转载请注明原文地址: https://www.6miu.com/read-48519.html

最新回复(0)