java中equals()和等值比较

来源:互联网 发布:windows redcine 报错 编辑:程序博客网 时间:2024/05/12 14:14

在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。

原创粉丝点击