何时需要重写equals()
当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。
object规范规定,如果要重写equals(),也要重写hashcode()
如何覆写equals()
覆写equals方法
1 使用instanceof操作符检查“实参是否为正确的类型”。
2 对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
3. 对于非float和double类型的原语类型域,使用==比较;
4 对于对象引用域,递归调用equals方法;
5 对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;
6 对于double域,使用Double.doubleToLongBits(adouble)转换为int,再使用==比较;
7 对于数组域,调用Arrays.equals方法。
例子:
/****
*
*
* java 八大基本数据类型
*/
private int A_int;
private short A_short;
private char A_char;
private byte A_byte;
private double A_double;
private float A_float;
private boolean A_boolean;
private long A_long;
private Demo demo;//对象
private int[] intArray;//数组域
private Demo[] demos;//对象数组域 @Override
public boolean equals(Object obj) {
if (!(obj instanceof MyDemo )){
return false;
}
MyDemo demo=(MyDemo)obj;
return demo.A_int==A_int&&
demo.A_byte==A_byte&&
demo.A_boolean ==A_boolean&&
demo.A_short==A_short&&
demo.A_char==A_char&&
demo.A_long==A_long&&
Float.floatToRawIntBits(demo.A_float)==Float.floatToRawIntBits(A_float)&&
Double.doubleToRawLongBits(demo.A_double)==Double.doubleToRawLongBits(A_double)&&
demo.demo.equals(demo)&&
this.intsequals(demo.intArray)&&
this.objArrayequals(demo.demos);
} private boolean intsequals(int[] ints){
return Arrays.equals(intArray, ints);
}
private boolean objArrayequals(Demo[] demos){
return Arrays.equals(demos, demos);
}