在Java中==与equals都是比较的意思,返回的都是布尔值。那么两者有何区别呢?
在基本数据类型中是只能使用==进行比较的,基本数据类型是无法调用object类的equals方法的
int a = 10;
double b = 10;
//System.out.println(a.equals(b)); 在基本数据类型进行比较的时候是无法使用equals方法的
System.out.println(a==b); //true
在基本数据类型中当变量指向的常量值是一样的则会存储在同一内存空间中,该内存空间有对应的地址值,在进行比较的时候就是比较地址值是否一致,如 int a = 10;double b = 10;变量a、b在内存中对应同一地址值,所以进行比较的时候地址值相同,返回值为true
那么是不是基本数据类型就无法参与equals方法进行比较呢?
答案当然是否定的,基本数据类型是可以作为equals方法的参数进行使用的
int c = 10;
Integer d = 10;
//基本数据类型无法调用equals方法,不过可以作为参数进行比较
System.out.println(d.equals(c)); //true
对于基本数据类型,无法直接调用equals方法,可以转换为对应的包装类调用equals方法
//定义基本数据类型
int e = 10;
double f = 10;
//转换为对应的包装类
Integer g = e;
Double h = f;
//调用equals方法
System.out.println(g.equals(h)); //false
通过以上代码我们发现原本 e==f 应该是会返回 true 的,可是为什么转换为对应的包装类后使用equals方法得到的结果就是false呢?
这是因为在基本数据类型中e、f变量的值都是对应常量10,在内存中对应的地址值是一致的,所以e= =f会得到true,但是转换为对应的包装类后就是引用数据类型,g、h数据类型不同,指向的是不同内存空间,一个是Integer,一个是Double,数据类型不同,地址值不同,所以是false
Integer aa = 10;
Integer bb = new Integer(10);
System.out.println(aa==bb); // false
System.out.println(aa.equals(bb)); // true
同样都是Integer引用数据类型但是bb对象是 new 创建的,会在内存中分配一个新的地址,所对应的地址值与 aa 的不一致,= =比较地址值,发现地址值不一致,所以返回 false , 在Integer 类中重写了继承于Object类的 equals 方法,比较的是值是否相等,10 ==10 成立,所以返回的是true
总结:创建引用类型对象时如果调用了new关键字,一定会在内存中分配一个新的地址,该地址与之前的地址是不一样的,如以上代码的aa 与 bb 的地址值就i是不一样的;
注意:Object类中的equals方法默认返回的是==进行比较的结果,在使用对象调用 equals方法前需确认该对象所属的类是否有重写equals方法,若是没有重写 equals 方法则会导致值相等,但地址值不一样而得到false;
在调用equals方法的时候要避免空指针异常,也就是不要出现 null.equals()
String a = null;
//以下代码其实就是null.equals(),会出现NullPointerException异常
a.equals("null");
//为避免此类情况,可以在调用方法的时候做一个非null判断
if (a != null) {
a.equals("null");
}
//当然也可以用我们确认的不为null的值来调用equals方法
"null".equals(a);