在java中,我们通常使用==或者equlas去判断两个变量是否相等。
1.==
当判断两个基本数据类型(int,long...)的是否相等的时候,不需要两个变量数据类型相同,只要值相等就返回true。
eg:
int i = 65;
float f = 65.0f;
char c = 'A';
System.out.println(i == f);
System.out.println(i == c);
System.out.println(c == f);
他们的返回值都为true
当两个引用类型的变量,使用==进行比较的时候,两个变量必须指向同一个对象时才返回true
eg:
Person p = new Person("孙悟空");
Person p2 = p;
System.out.println(p == p2); //此时返回true
Person p1 = new Person("hello java");
Person p2 = new Person("hello java");
System.out.println(p1 == p2); //此时返回false,因为在堆中new了两个Person对象,即使他们的值都为hello java,但是他们的内存地址不一样。
2.equals
基本数据类型不能通过equals方法来进行比较,equals方法是Object中的一个方法,必须通过引用变量来调用。
String str1 = new String("hello java");
String str2 = new String("hello java");
System.out.println(str1 == str2); //false
System.out.println(str1.equals(str2));//true
上学的时候大家肯定都看过这样的代码,当时的理解是equals是比较变量的值,现在发现这个是错误的,String类中重写了equals方法,使他在这种情况下根据值判断返回了true,实际上equals如何判断,都掌握在自己手里面,此处的String自己封装好了,是一个特殊的例子。
一般我们重写equals方法会这么写:
public boolean equals(Object obj){
if(obj != null && obj instanceof Person){
Person p = (Person)obj;
//根据特定的属性判断,此处假设存在年龄这个属性
if(this.getAge() == p.getAge())
return true;
}
return false;
}
但是此处存在一点问题,主要是instanceof,当instanceof前面的对象是instanceof后面类的实例,或者子类实例时,都返回true,这就会带来一些问题。
下面提供一段比较好的重写equals的代码:
public boolean equals(Object obj){
//当equals前后是同一对象的时候,返回true
if(this == obj)
return true;
if(obj != null && obj.getClass() == Person.class){
Person p = (Person)obj;
//根据特定的属性判断,此处假设存在年龄这个属性
if(this.getAge() == p.getAge())
return true;
}
return false;
}
这里面用到了java反射里面的知识。