基本原理
java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false。
java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2,obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向同一个对象才返回ture。
遇到的问题
如果想要自定义两个对象(不是一个对象,即这两个对象分别有自己的一块内存)是否相等的规则,那么必须在对象的类定义中重写equals()方法,如果不重写equals()方法的话,默认的比较方式是比较两个对象是否为同一个对象。
在Java API中,有些类重写了equals()方法,它们的比较规则是:当且仅当该equals方法参数不是 null,两个变量的类型、内容都相同,则比较结果为true。这些类包括:String、Double、Float、Long、Integer、Short、Byte、Boolean、BigDecimal、BigInteger等等,太多太多了,但是常见的就这些了,具体可以查看API中类的equals()方法,就知道了。
重写equals的原则
- 1、先用“==”判断是否相等。
- 2、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。
- 3、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。
- 4、判断类的成员是否对应相等。
代码示例
package entity;
public class One{
public Boolean BoolValue;
public Integer IntValue;
public Byte ByteValue;
public String StringValue;
public One() {
}
public One(boolean a, int b, byte c, String d) {
this.BoolValue = a;
this.IntValue = b;
this.ByteValue = c;
this.StringValue = d;
}
public boolean isBoolValue() {
return BoolValue;
}
public void setBoolValue(boolean boolValue) {
BoolValue = boolValue;
}
public byte getByteValue() {
return ByteValue;
}
public void setByteValue(byte byteValue) {
ByteValue = byteValue;
}
public int getIntValue() {
return IntValue;
}
public void setIntValue(int intValue) {
IntValue = intValue;
}
public String getStringValue() {
return StringValue;
}
public void setStringValue(String stringValue) {
StringValue = stringValue;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
if(obj instanceof One){
One one = (One) obj;
if (this.BoolValue != one.BoolValue) {
return false;
}
if(this.IntValue != one.IntValue) {
return false;
}
if(this.ByteValue != one.ByteValue) {
return false;
}
return this.StringValue.equals(one.StringValue);
}
return false;
}
}