==比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。需要注意的是,如果比较的是基本数据类型,例如byte,short,char,int,long,float,double,boolean
此时比较的是值是否相等
如以下代码:
int a = 1;
int v = 1;
System.out.println(a==v);//true 此时比较的是值
String str1 = new String("Jim");
String str2 = new String("Jim");
System.out.println(str1 == str2);//false 此时比较的是地址值
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
equals源代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
此时如果我们再次比较str1和str2,利用equals方法,我们可以发现,返回值为true,此时比较的是对象的内容,而不是地址值
System.out.println(str1.equals(str2));//true 此时比较的是对象的内容
如果此时我们获取它们的地址值,我们会发现,两者的地址值并不相等
System.out.println(System.identityHashCode(str1));//509886383
System.out.println(System.identityHashCode(str2));//1854778591
故,equals方法比较的是对象的内容而不是地址值,==比较的是地址值