==和equals的区别和联系
“==”是关系运算符,equals()是方法,同时他们的结果都返回布尔值;
“==”使用情况如下:
a)基本类型,比较的是值
b)引用类型,比较的是地址
c)不能比较没有父子关系的两个对象
equals()方法使用如下:
a)系统类一般已经覆盖了equals(),比较的是内容。
b)用户自定义类如果没有覆盖equals(),将调用父类的equals(比
如是Object),而Object的equals的比较是地址(return(this==obj);)
c)用户自定义类需要覆盖父类的equals()
注意:Object的==和equals比较的都是地址,作用相同
代码示例:
public class Demo01 {
public static void main(String[] args) {
String s1 = new String("zhangsan");
String s2 = new String("zhangsan");
System.out.println(s1.equals(s2));//true
Book b1 = new Book("aa", "11");
Book b2 = new Book("aa", "11");
System.out.println(b1.equals(b2));//false
}
}
class Book{
private String name;
private String author;
public Book(String name, String author) {
super();
this.name = name;
this.author = author;
}
}
可以进入第一个equals方法看下源码:string重写了object的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;
}
而equals默认的方法是比较引用地址:
public boolean equals(Object obj) {
return (this == obj);
}
总结:在很多使用过程中,equals方法被重写了,所有一般情况下比较的是两者的值是否相等。