相信各位都知道==和equals的区别,所以在此只讲equals方法。
String str1 = new String("str");
String str2 = new String("str");
System.out.println(str1.equals(str2));//结果为true
StringBuffer buf1 = new StringBuffer("buf");
StringBuffer buf2 = new StringBuffer("buf");
System.out.println("--------"+buf1.equals(buf2));//结果为false
懵逼,为什么String中的equals方法为true,而StringBuffer中的equals方法呢?接下来我们看看源码
String中的equals方法源码如下:
public boolean equals(Object anObject) {
if (this == anObject) {//先进行地址比较
return true;
}
if (anObject instanceof String) {//接着判断是否为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;
}
StringBuffer中的方法如下,明显看出他并没有equals方法,同时他继承的AbstractStringBuilder类和实现的Serializable, CharSequence接口都没有equals方法,那么他的equals方法从哪里来的呢?xiongdi,别忘了,在java中所有的类都是Object的子类,所以他的equals代码如下:
public boolean equals(Object obj) {
return (this == obj);//只比较地址
}
看到可以发现,string中的equals方法会先进行地址比较,然后判断是否都是string对象,接着进行字符比较,而StringBuffer只进行地址比较,所以就会出现上面的结果。那么我们在开发中如果只需要比较对象的值而不需要比较地址时,该如何写代码呢?哈哈,重写equals方法,下面给出一个列子:
新建User类,代码如下:
public class User {
public String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
测试:
User user = new User();
user.setUsername("user");
User user2 = new User();
user.setUsername("user");
System.out.println(user.equals(user2));//false
然后修改User类
public class User {
public String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
//重新equal方法
@Override
public boolean equals(Object obj) {
if(null == obj) {
return false;
}
User user = (User) obj;
if(null == this.username && null == user.getUsername()) {
return true;
}else {
//调用string中的equal方法先进行地址比较,然后进行字符比较
return this.username.equals(user.getUsername());
}
}
}
在测试:
User user = new User();
user.setUsername("user");
User user2 = new User();
user.setUsername("user");
System.out.println(user.equals(user2));//true
这是个人今天看源码发现的,不过,发现一点让我很懵逼的事情,不清楚value属性是怎样来的,欢迎各位大佬分享
public String(String original) {
this.value = original.value;//value怎么来的怎么来的??????????????
this.hash = original.hash;
}