一、equals()方法和"=="运算符比较(一)
equals()
超类Object中有这个方法equals()方法,该方法主要用于比较两个对象是否相等。源码如下:
public boolean equals(Object obj){
return(this == obj);
}
所有对象都拥有标识符(内存地址)和数据,同时"=="比较两个对象的内存地址,所有说使用Object的equals()方法是比较两个对象的内存是否相等,即:object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。实际上JDK中,String、Math封装类都重写了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;
}
非常清晰的看到String的equals()方法是进行内容比较,而不是引用比较。其他封装类也差不多。
二、equals()方法和"=="运算符比较(二)
特殊情况用法:
有两种用法说明:
(1)对于字符串变量来说,使用"=="和"equals()"方法比较字符串是,其他比较方法不同。
"=="比较两个变量的值,即两个对象在内存中的首地址。
"equals()"比较字符串中所包含的内容是否相同。
比如:
String s1,s2,s3 = "abc",s4 = "abc";
s1 = new String("abc");
s2 = new String("abc");
那么:
s1 == s2是false,两个变量内存地址不一样,也就是说它们指向的对象不一样,所以不相等。
s1.equals(s2)是true,两个变量的所包含内容是abc,所以相等。
注意(1):
如果:StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
结果:s1.equals(s2);//false
原因:StringBuffer类中,没有重写equlas,因此这个方法调用的是Object中equals()方法,用来比较"地址值",所以不相等。
注意(2):
由于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的地址值是相等的,所以s3==s4是true(即使没有s3=s4赋值语句)
(2)对应非字符串变量来说,"=="和"equals()"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个变量是否指向同一个对象。
如:
class Person
{
Person obj1 = new Person();
Person obj2 = new Person();
}
那么:obj1 == obj2 是false
obj.equals(obj2)是false
但:如果加上:obj1 = obj2;
那么:obj1 == obj2 是true
obj.equals(obj2)是true
三、equals()方法和"=="运算符比较(三)
总之:
equals()方法对应字符串来说是比较内容的,而对于非字符串来说比较其指向的对象是否相同的。
== 比较符也是比较指向的对象是否相同的也就是对象在堆内存中的首地址。
String 类中重新定义了equals这个方法,而且比较的是值,而不是地址。所有是true。
注意:
如果是基本类型比较,那么只能用==来比较,不能用equals
public void testEquals() {
int a = 1;
int b =2;
int c = 1;
System.out.println(a==b);//false
System.out.println(a==c);//true
System.out.println(a.equals(c));//编译错误
//不能运用于基本数据类型的比较
}
对于基本数据类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==比较地址的,而equals是比较内容。
public void test00() {
Integer n1 = new Integer(1);
Integer n2 = new Integer(1);
Integer n3 = new Integer(2);
System.out.println(n1 == n2);//false,对象不同,所有地址不同
System.out.println(n1 == n3);//false
System.out.println(n1 .equals(n2));//true,指向的对象中内容是相等的
System.out.println(n1 .equals(n3));//false,指向的对象中内容是不相等的
}
其他基本数据类型也是一样的道理。
=======================分割线=====================
转载请注明出处