在刚开始学习类中的相关的方法时,由于继承和重写,可能会有些方法我们不能很好的理解,很有可能会混淆。下面只是本人自己对equals方法的理解,自己的总结,自己学的的东西,自己总结,若有错望指正。
首先我们要知道equals方法是哪里来的,我们知道如果我们创建一个新类,这个类默认继承的类是Object。Object类中有方法equals,所以这个方法就会被继承下来。既然知道了equals的来源,我们可以看看Object类中的equals方法的底层实现。
//这就是Object的Equals方法的底层实现。(底层实现是使用“==”来实现的,这点很重要)
public boolean equals(Object obj) {
return (this == obj);
}
看到了底层的实现,现在我们需要弄清楚的是“==”和equals的区别?
首先我们看看“==”的使用,1.对于基本数据类型,“==”用来比较值得大小是否相等
2.对于抽象数据类型,“==”用来比较引用(我也当做是地址,只要两个抽象数据类型的地址不一样,返回的是false)
再来看看equals的使用,因为equals方法是用==来实现的,按理来说应该一样的,但是这个方法会被重写,所以作用自然就会根据自己的重写来使用
1.对于String类型,比较的是两个字符串的内容是否一样。并不是地址
2.对于自己新建的类,比较的是两个对象的引用。(前提是自己没有重写方法equals)
有人会问,String类型也是抽象数据类型,为什么它调用equals方法是比较的内容,而不是对象的引用。要看清这个问题,我们要去看看类String的方法equals的底层实现。
//这就是String类的equals方法的底层实现,显然和Object中的不一样了。(解释:如果是同一个对象,返回true,如果不是,检查字符串,全部一样返回true,有一个不一样就会返回false)string类重写了方法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;
}
对于==的使用,我们还有一个常量池(缓冲池)的问题。下面的例子应该可以很容易看到。
/*
* 运行结果
* s1==s2
* s1 equals s2
* 原因:
* 常量池的问题(think in java 上边叫做缓冲池)
* 刚开始定义s1的时候,赋值一个常量给s1,然后会把常量加入到常量池中
* 后来在定义的时候,如果在常量池中能够找到这个常量,那么会直接引用这个地址
* ==比较的是地址,所以会显示地址相同
*
* 替换成为String s2=new String("aaa");
* 运行结果
* s1!==s2
* s1 equals s2
* 原因:
* 虽然字符串一样 但是两者的地址不同 因为使用new来新建一个string类型的变量 相当于
* 本来有但是我不用,我要新建一个。所以两者的地址不同。
*
*
* equals的讲解:
* equals这个方法都是从object中继承得来的,在object的底层,equals的方法体就是用==
* 来编写的,所以如果继承来的equals的没有被重写,那么这个方法的作用和==应该一样都是比较
* 地址
* 下面程序中的string类中使用的equals 是重写后的equals,重写后比较的是字符串的内容
* 可以到equals的底层去查看。
*/
public class Test2 {
public static void main(String[] args) {
String s1="aaa";
String s2="aaa";
//String s2=new String("aaa");
if(s1==s2){
System.out.println("s1==s2");
}else{
System.out.println("s1!==s2");
}
if(s1.equals(s2)){
System.out.println("s1 equals s2");
}else{
System.out.println("s1 not equals s2");
}
}
}
希望对初学者有一定的帮助。