关于String重写的equals方法
程序员文章站
2022-04-15 23:44:05
...
想了想自己也想尝试写写博客,分享自己作为初学者的一些学习心得,才刚刚学习没几天,闲谈而已,请大佬多多指教,第一:关于String重写的equals方法;
1.String 类为啥要重写equals方法;
首先,任何类的父类都是object类,所以String类也是继承了object类。那么为啥String要重写equals方法呢;
首先我们看看object类里面的equals方法.
public boolean equals(Object obj) {
return (this == obj);
}
然后我们在看看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;
}
可以看到object类里面的equals只使用了 == 作为判断,而String类里面先是if (this == anObject) 作为判断,如果不为true再继续把String类型转换成char数组,依次遍历进行逐个字节的比对。那么为什么要这么做呢?
我们先看看以下代码:
String str1 = "小红";//此处小红为常量,存放于常量池中
String str2 = "小红";//此处小红为常量,同样存放于常量池中
String str3 = new String("小红");
String str4 = new String("小红");
System.out.println(str1 == str2);//true
System.out.println(str2 == str3);//false
System.out.println(str3 == str4);//false
System.out.println(str3.equals(str2));//true
System.out.println(str2.equals(str3));//true
System.out.println(str3.equals(str4));//true
接下来再看java的一个我自己画的内存图
通过图片可以看到,每个对象都是在堆里面独自开辟一个空间,并且类的每个对象独享一份类的属性;然后再把对象的地址赋值给引用,也就是图片中箭头所指。
而我们常用的“==”就是对地址进行比较,所以才会出现
System.out.println(str1 == str2);//true
System.out.println(str2 == str3);//false
System.out.println(str3 == str4);//false
而我们需要比较的两个的值是否相同,所以String类就重写了equals方法,也就是上边我们看到的首先比较地址是都相同,相同就返回true,不同就把值取出转换成char[],逐个字节进行比较。
值得一提的是,当我们写实体类也要重写equals方法,就是为了我们在进行比较时,避免出现相同情况。
以上为自己的一些理解,如有错误之处,请各位大佬多多指教;