Java_collection Object超类 hashCode与equals区别
Java 集合框架中散列表hashTable 即HashMap中使用了hashcode方法,所以先学习一下hashcode方法。
Object类
Object类是java中所有类的超类。java中每个类都扩展了Object。
java中只有基本类型不是对象,如数字,字符,布尔类型。
equals方法
指示某个其他对象是否与此对象“相等”。
一般equals方法都判断的两个对象的引用是否相同。
而有时候我们并认为这样满足我们的需要。
如员工类有两个属性 姓名,年龄。假如从业务逻辑上我们默认姓名和年龄相同的员工就默认是同一个员工。当使用new关键字创建两个员工对象时,使用equals方法判断是不同的,但在业务逻辑层面是相同。员工类就需要重写Object的equals方法,来满足我们的要求
Object工具类equals方法
如果判断两个对象是否相同,可以使用该方法。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
为什么不用equals方法,因为下面方法会返回true
public static void main(String[] args) {
String s = new String();
String s1 = new String();
System.out.println(s.equals(s1));
}
Java语言规范要求equals方法具有下面的特性:
- 自反性:对于任何非空引用x,x.equals(x)应该返回true。
- 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true。
- 传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true。
- 一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。
- 对于任意非空引用x,
看完上面的特性,建议还是不要重写equals方法
hashCode()方法
散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的。如果x和y是两个不同的对象x.hashCode()与y.hashCode()基本上不会相同。
public class HashCodeTest {
public static void main(String[] args) {
String str = "Java";
String strJ = new String("Java");
StringBuilder strJava = new StringBuilder(str);
StringBuilder strJava2 = new StringBuilder(strJ);
System.out.println(str.hashCode());
System.out.println(strJ.hashCode());
System.out.println(strJava.hashCode());
System.out.println(strJava2.hashCode());
}
}
执行结果
2301506
2301506
895328852
1304836502
Process finished with exit code 0
hashCode()与equals()区别
- hashCode() 性能高,使用hash值比较,效率高。
- equals() 更可靠,因hashcode大部分时候是可靠的,偶尔会出现hash值一样,值不同的情况。
- equals相等的对象,hashCode肯定相等
- hashCode相等,equals不一定相等。
只要重写equals 必须重写hashCode
因为Set存储的是不重复的对象,所以Set必须重写这两个方法。
使用自定义对象作为Map的key,必须重写这两个方法。
String重写了hashCode和equals方法,所以我可以无顾虑的使用String作为key。
什么时候要重写hashCode?
只有当类需要方法HashTable、HashMap、HashSet等hash结构的集合中时需要重写hashCode;
为什么equals相等,hashCode一定要相等?
按照hashCode来定位小内存块,所以hashCode必须相等。
hashCode 详细内容参考:https://blog.csdn.net/xlgen157387/article/details/88087963