Java中==和equals的区别:==和equals都是用来比较左右两边是否相等的。但二者有着很大的区别:如果比较的是8种基本数据类型(byte、short、int、long、float、double、char、boolean),只能用==进行比较。代码示例如下
package oneHundredDayPlan.twoDay;
public class One {
public static void main(String[] args) {
int a = 3;
int b = 3;
if(a==b){
System.out.println("两个数相等");
}else{
System.out.println("两个数不相等");
}
}
}
第一个代码运行结果为两个数相等,而第二段代码报错,这证明了当比较的是基本数据类型的时候只能用==来进行比较
如果比较的是普通的引用类型(除字符串类型) ,==和equals比较的都是地址。代码示例如下
package oneHundredDayPlan.twoDay;
public class One {
public static void main(String[] args) {
//创建两个引用指向同一个对象(对象名中存的地址相同)
Object a = new Object();
Object b = a;
System.out.println(a==b);//true
System.out.println(a.equals(b));//true
//创建两个对象,内容相同,地址不同
Object c = new Object();
Object d = new Object();
System.out.println(c==d);//false
System.out.println(c.equals(d));//false
}
}
而对于字符串类型来说,==比较的是地址,而equals比较的是内容。代码示例如下
package oneHundredDayPlan.twoDay;
public class One {
public static void main(String[] args) {
//在这个例子中,尽管a和b的内容都是"HelloWorld",但由于它们是使用new关键字创建的,
//所以它们是在堆上独立分配内存空间的两个不同对象
String a = new String("HelloWorld");
String b = new String("HelloWorld");
//判断a和b的地址是否相等的
System.out.println(System.identityHashCode(a));//460141958
System.out.println(System.identityHashCode(b));//1163157884
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
}
}
equals在比较内容的时候,需要将字符串转换为字符数组,然后再通过循环进行逐一比较,但是为了提高比较效率,设置的三重判断,第一重比较两个对象的地址是否相同,如果地址相同则表示是同一个对象,返回为true,如果两个对象地址不相同,则进行第二重判断,比较对象是不是String类型的,如果不是,就返回false,如果为true则进行第三重判断,第三重判断,比较两个字符串长度是否相同,如果长度不相同,则证明这是两个字符串,如果长度相同,再进行转换为字符数组,进行按位逐一比较。
源码如下
equals的实现原理:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}