当前位置 博文首页 > 一个搬砖的农民工的博客:java中equals和==的区别
1.equals方法在Object类中判断的是地址,以下是Object源码
public boolean equals(Object obj) {
return (this == obj);
}
2.equals在String类中判断的是内容,以下是String源码
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类一样重写了equeals方法的判断的就是内容。
例子1:
public static class User {
private String id;
private String name;
}
User aa = new User();
User bb = new User();
aa.id = bb.id = "123";
// 因为User是继承的Object,并且没有重写equals方法,所以判断的是地址,而两个不同的对象地址是不一样的,所以为false
System.out.println(aa.equals(bb)); // false
如果我在User上加一个@Data注解
@Data
public static class User {
private String id;
private String name;
}
那么System.out.println(aa.equals(bb));
得到的就是true
了,因为@Data注解已经帮我重写了equals方法,或者你自己重写也可以。
例子2:
String a = "apple";
String b = "apple";
StringBuffer c = new StringBuffer("apple");
// 因为StringBuffer没有重写equals方法,所以调用的是Object类的方法
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); // false
3.equals方法不能用于基础变量,如int,char等,因为这是Object的方法,必须继承Object或者子类
==判断的是地址
String a = "abc";
String b = "abc";
String c = new String("abc");
// 因为直接定义的是放在同一个地址的常量池中,new出来的是重新创建的一个地址
System.out.println(a==b); // true
System.out.println(a==c); // false
注:String大小是固定的,若
String s = "123";
s = s + "321";
这里不是在原来基础上改变值,而是重新创建了一个地址存放值
cs