java覆写equals方法
何时需要重写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); }