一、对于基本数据类型而言只能用“==”,不能用equals来进行比较,若使用equals来进行比较,则不能通过编译
二、在非字符串的对象的比较中:
“==”与“equals()”比较的均是对象在堆内存中分配的首地址。(即使比较两个变量是否指向同一个对象)
class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
} public class B1 {
public static void main(String as[])
{
Student a= new Student("张三",21);
Student b=new Student("张三",21);
System.out.println(a==b);//false
System.out.println(a.equals(b));//false
} }
运行结果:
不仅是上面这个例子会返回false,只要是在未重写equals方法的所有非字符串的类的实例的比较均会返回false:Object类中定义的equals方法是比较引用地址,而每个对象的引用地址又不相同,所以都会返回false。
解决方法
想要得到比较对象里的内容的真实结果,就得重写equals()方法。
在上面的例子中重写equals()方法:
省略掉与上面例子完全相同的B1类,修改Student的代码如下:
class Student {
private String name;
private int age;
public Student(){}
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
public boolean equals(Object a)
{ if(a==null)
return false;
if(!(a instanceof Student))
return false;
Student student=(Student) a;
return this.name.equals(student.name)&&this.age==student.age; }
}
运行结果如下:
三、在字符串对象的比较中的区别:
“==”,比较的是首地址
equals(): 比较的是里面的内容。
下面通过一个例子来详细讲解:
public class D {
public static void main(String as[])
{
String x1=new String("aass");
String x2=new String("aass");
String x3=new String(x1);
System.out.println(x1.equals(x2));//返回true;里面的内容相同
System.out.println(x1==x2);//返回false;x1与x2不是同一个对象,所以首地址不同
System.out.println(x1==x3);//返回false;理由同上
System.out.println(x1.equals(x3));//返回true;里面的内容都是“aass” String a1="abc";
String a2="abc";
String a3=new String("abc");
System.out.println(a1==a2);//返回true;
System.out.println(a1==a3);//返回false
} }
运行结果为: