package fivetwo; public class Employee{ private String str; private int x; /* * equal的原则: * 自反性:对于任何非空的 x.equals(x)返回true * 对称性:对于任何x,y x.equals(y)的结果与y.equals(x)相等 * 传递性:对于任何x,y,z x.equals(y)为true,y.equals(z)为true,x.equals(z)为true * 一致性:x和y的对象没有方法改变 x.equals(y)值不变 * x为非空,equal(null) 返回为false */ public static void main(String[] args) { Employee newEmployee = new Employee(); newEmployee.method1(); } public boolean equals(Object otherObject){ if (this == otherObject) { return true; } if (otherObject == null) { return false; } if (!(getClass() == otherObject.getClass())) { return false; } Employee other= (Employee)otherObject; // return (this.x == other.x && this.str.equals(other.str)); return (this.x == other.x && ObjectExtend.equals(this.str, other.str)); } /* * 散列码 has code * 定义:对象导出的整型值,散列码是没有规律的。 * * String的hasCode算法是31*i+char[j] * int的hasCode : 值本身 * * StringBuffer 没有hashCode方法,导出的对象储存地址 */ public void method1(){ // System.out.println(this.str.hashCode()); // Employee newEmployee = new Employee(); // System.out.println(newEmployee.hashCode()); System.out.println(new Integer(6).hashCode()); } public int hashCode(){ // return ObjectExtend.hasCodes(this.str)+ // new Integer(x).hashCode(); return ObjectExtend.hash(this.str,this.x); } }
package fivetwo; public class Manager extends Employee{ private int bonus; public static void main(String[] args) { // TODO Auto-generated method stub Manager m1 = new Manager(); Manager m2 = new Manager(); // m1.equals(m2); // Employee e1 = new Employee(); System.out.println(m1 instanceof Employee); System.out.println(e1 instanceof Manager); } //子类的比较先调用超类的equal方法,超类的域不相等就不可能相等 public boolean equals(Object otherObject){ if (!super.equals(otherObject)) { return false; } Manager other = (Manager)otherObject; return this.bonus == other.bonus; } }
package fivetwo; import java.util.Arrays; public class ObjectExtend extends Object{ public static void main(String[] args) { } //Objects.equals jdk的高版本非空判断 public static boolean equals(Object a,Object b){ return a==b || (a!=null && a.equals(b)); } public static int hasCodes(Object o){ return o != null?o.hashCode():0; } public static int hash(Object... o){ return Arrays.hashCode(o); } }