在Java程序中,要比较两个对象是否相等,经常会使用到“= =”和“equals”,那么什么时候我们用“= =”,什么时候用“equals”呢?这其实就是让我们来看看这两个比较方法的区别。在这里,最让我们搞混淆的是在String里面的比较,首先我们来看个例子:
public class Test01 {
public static void main(String args[]){
String str1="abc";
String str2="abc";
String str3=new String("abc");
if(str1==str2){
System.out.println("str1==str2");
}
if(str1==str3){
System.out.println("str1==str3");
}
if(str2==str3){
System.out.println("str2==str3");
}
}
}
程序结果:str1==str2
从结果可以看出,只有第一个if语句执行了,后面两个都没有,这也就是说:str1跟str2是相同的,而str3是跟这两个不同的。这是为什们呢?首先我们来看“str1==str2”这个问题,因为程序在运行时会创建一个字符串缓冲池,当使用Sring str2="abc",程序首先会在这个String缓冲池中寻找相同值的对象,而str1被放到了池中,所以在str2被创建的时候,程序找到了具有相同值的str1。在看“str3”为什么与“str1”“str2”不同,是因为在定义str3的时候,我们使用了new关键字,当类类型在创建对象时使用了new关键字,会在堆内存中开辟一个新的空间,从而来存储其内容,而“==”比较的是其堆内存地址,故str3与前两个是不同的。
这时,我们变一下,用“equals()”来比较,代码如下:
public class Test02 {
public static void main(String args[]){
String str1="abc";
String str2=new String("abc");
String str3=new String("abc");
if(str1.equals(str2)){
System.out.println("str1==str2");
}
if(str1.equals(str3)){
System.out.println("str1==str3");
}
if(str2.equals(str3)){
System.out.println("str2==str3");
}
}
}
结果为;str1==str2
str1==str3
str2==str3
从结果我们可以看出,这三个用equals()方法来比较的时候,都相等。这是因为,equals()比较的是这三个对象中在堆内存中的内容是否一样,不是比较地址,而我们定义这三个变量的时候赋的值是一样的,所以这三个用equals()方法比较的时候,结果都为true。
我们在看一个例子,自定义一个Student类
public class Student {
public Student(String name){
this.getName();
};
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
再来测试这个类:
public class Test03 {
public static void main(String args[]){
Student stu1=new Student("张三");
Student stu2=new Student("张三");
if(stu1.equals(stu2)){
System.out.println("两个学生相同!");
}
else{
System.out.println("两个学生不相同!");
}
}
}
程序结果为:两个学生不相同!
这个时候我们可能就会产生疑问了,不是说equals()比较的堆内存内容吗,为什么stu1.equals(stu2)的结果是false呢?看过API文档应该了解,equals()方法是Object这个类中,而String这个类是重写过这个方法的(在这里就不贴代码啦,大家可以自己去看文档),所以在String类中的equals()方法是比较两个变量的值。而我们自定义的Student类中,equals()方法是从Object这个继承过来的,也就是比较两个对象是否相等,很明显都是用new关键字来定义,肯定是不同的,所以结果为false。
<!--EndFragment-->