在JAVA中,== 和equals往往容易混淆,具体的使用会很模糊。
对于基本数据类型来讲,只能用 == 比较,这个比较简单,直接比较即可。
但在比较String等引用类型时,是使用== 还是equals,他们具体都是比较的内容?还是指向地址?
“==” 比较的是引用地址,
“equals” 比较的是具体的内容(针对于重写equals方法的Object类型)
Double double1 = new Double(1111);
Double double2 = new Double(1111);
System.out.println(double1 == double2); //false
System.out.println(double1.equals(double2)); // true
String string1 = new String("11111");
String string2 = new String("11111");
System.out.println(string1 == string2); //false
System.out.println(string1.equals(string2));//true
//当然查看Double的重写的equals,大体可以看出是比较了他具体的值是否相同。
public boolean equals(Object var1) {
return var1 instanceof Double && doubleToLongBits(((Double)var1).value) == doubleToLongBits(this.value);
}
为什么说针对于重写了equals方法的Object类型呢,java所有的类都是继承Object类的,如果不进行重写equals,那么和使用 == 效果是一样的。可以看到Object的源码:是直接使用 == 进行了比较。
public class Object {
public Object() {
}
//...//
public native int hashCode();
public boolean equals(Object var1) {
return this == var1;
}
所以说,像Java中的封装类型,Double,Integer。。等拿到对象进行比较时 ,使用equals比较其值(内容)是否相同。
对于String还有经常混淆的一个问题。
String a = "1234";
String b = "1234";
String c = new String("1234");
System.out.println(a == b); // true
System.out.println(a.equals(b)); // true
System.out.println(a == c); // false
System.out.println(a.equals(c)) // true
// 对于a,b,直接赋值首先回去内存中找是否存在"1234"的引用,如果存在,直接将引用指向a b,所以a,b 所对应的地址值是相等的。
// c 直接new的String,直接创建了c对象,而很显然地址值是不同的,