Object类有哪些方法?
Object类是所有类的父类,任何类都默认继承Object。Object类实现了以下几种方法:
- hashCode 方法和 equals 方法。重写 equals 方法一般都要重写 hashCode 方法。Java规定:如果两个对象的 equals 方法比较结果为 true 的话,它们的 hashCode 方法也必须相同。之所以这样规定是因为,如果两个对象的 hashCode 相同,那在 hashMap 中,它们会定位到同一个桶的位置,但无法得知它们两个在这个桶中是否重复,所以需要再通过重写的 equals 方法来比较它们的值是否相等。如果两个对象的 equals 比较的值相等,但没有重写 hashCode 方法来保证它们的 hashCode 相同,就会导致它们定位到不同的桶的位置,而它们的值又是相等的,就会出现错误。
- clone 方法
- toString 方法 Objectl默认的toString()方法输出的是类名+@+哈希值的16进制形式
- wait 、notify 和 notifyAll 方法
- getClass 方法,用于获得运行时类型。
1. 怎么判断两个对象是否相等?
- 如果是判断两个对象是不是同一个对象,就用==判断;
- 如果是判断两个对象的内容是否相等,就重写equals和hashCode方法,再用equals方法判断是否相等
2. == 和 equals 的区别
- == 对于基本类型,比较的是值是否相同;对于引用类型,比较的是引用保存的对象的地址是否相同
- Object 默认提供的 equals 方法比较的是对象的地址,但是很多类重写了 equals 方法,比如String、Integer 等 把引用比较改成了内容比较,所以一般情况下 equals 比较的是值。
3. Object的equals()和hashCode()方法
Object的hashCode值是根据对象的内存地址换算出来的一个值。
Object的equals方法是使用==,也就是判断内存地址是否相等。
4. 为什么要重写equals?
因为在实际的业务中可能不需要严格意义上的相等,只需要业务上的相等,这时就要重写equals()方法来满足业务需求
5. 为什么重写equals()的同时要重写hashCode()?
因为java关于hashCode有约定,如果两个对象根据equals(Object)方法是相等的,那么这两个对象的hashCode必须相等。
如果重写equals()却不重写hashCode(),就会违反这个约定。
6. 为什么重写equals方法的同时要重写hashCode方法?
HashMap在进行put操作时,是通过hashCode计算对应桶的位置的,如果重写了equals方法,没重写hashCode方法,那么key相同的两个元素就有可能会分到不同的桶中,即使分到了一个桶中,后一个元素也不会覆盖掉前一个元素,hashMap判断两个对象是否相等会判断hash值和equals都相等才行。当我们进行get(key)操作时,也是要判断hash值和equals都相等才行,重写 hashCode 就是为了保证相同的对象返回相同的 hash 值,不同的对象返回不同的 hash 值,这样才能让我们准确的判断出要查找的值。
7. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不一定。
两个String的HashCode()相同,但是equals()不一定相同。
8. String中hashCode的实现?为什么 String 中的 hashCode 方法选择数字31作为乘子
String类中hashCode的计算方法:它以31为权,用 自然溢出 来等效取模。哈希具体计算公式为:val[0] * 31 ^ (n-1) + val[1] * 31 ^ (n-2) + … + val[n-1] ,n 是 String 中 value 数组的长度,31 ^ 0 等于 1。之所以选择31是因为它是一个奇质数,它的乘法运算可以被位运算和减法运算取代,从而获取更好的性能:31 * i == (i << 5) - i 。