equals()
java中默认的equals()方法的实现来自于Object类,主要用于比较两个对象是否相等,实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
首先我们必须明确一点就是:equals()是方法“==”是运算符。
对于对象都有内存地址和数据,“==”是比较两个对象的内存地址,所以说Object类的equals()方法是用来比较两个对象的地址是否相等的,当返回为true时,实际上是表示引用了同一个对象。在大多数情况下Object中的equals()方法是可以满足我们的基本需求的,但是有时候需要多我们自定义的对象进行比较,这个时候就需要我们主观上的覆写equals()方法。
在JDK中大多数类都对Object中的equals()方法进行了覆写,下面我们以String类为例进行分析
String类的equals()方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
最直接的就是比较字符(内容)是不是都相同,不是引用。其他的封装类大都类似!
equals()方法和“==”运算符的比较
经常误用的原因分析:
有两种用法:1.字符串 2.非字符串
(1)字符串变量
"equals()"方法:比较字符串的每个字符(内容)
“==”比较两个变量本身的值,两个对象在内存中的首地址
结果:false true true true
str1和str2地址不等,内存相等
str3和str4地址和内存都相等。由于str3和str4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true。
特别的:对于StringBuffer
结果都是false;
原因:StringBuffer没有覆写Object的equals()方法。而Object类中的equals方法是用来比较“地址”的,所以结果为false。
(2)非字符串变量
"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即是否是引用同一个对象。
结果都是false;
注意添加一句 e1=e2;