版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/OOC_ZC/article/details/84062549
1. equals() : 判断两个对象是否等价。
Object类的默认实现(直接检查是否为同一个对象的引用):
Object类equals()的默认实现并不能很好的体现equals()想要的功能。因为不指向同一个对象,两对象也可能等价(关键域相同)。
看String类equals()的实现:
这是一个标准的equals()的实现,大体思路是:
- 检查是否为同一个对象的引用,如果是直接返回 true;
- 检查是否是同一个类型,如果不是,直接返回 false;
- 将 Object 对象进行转型;
- 判断每个关键域是否相等。
2. hashCode() :生成对象的散列值。
- hashCode() 返回
int
类型的散列值,而 equals() 是用来判断两个对象是否等价。等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价(散列冲突)。 - 在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证等价的两个对象散列值也相等。
hashCode() 的实现: 理想的散列函数应当具有均匀性,即不相等的对象应当均匀分布到所有可能的散列值上。这就要求了散列函数要把所有域的值都考虑进来。可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位,例如:
@Override
public int hashCode() { // 返回值为int类型
int result = 17;
result = 31 * result + x;
result = 31 * result + y;
result = 31 * result + z;
return result;
}
看String类hashCode()的实现:
3. toString() :生成关于对象的String。
Object类的默认toString() 方法:
Interger.toHexString(int i)
作用是将整数 i 转成一个十六进制的字符串。
String类的toString() 方法:
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
4. clone() : 克隆当前对象并返回。
Object类默认的clone() 方法是native类型:
protected native Object clone() throws CloneNotSupportedException;
- clone() 是 Object 的 protected 方法,它不是 public,一个类不显式去重写 clone(),其它类就不能直接去调用该类实例的 clone() 方法。
- 应该注意的是,使用clone()函数还需要实现Cloneable接口,否则会抛出
CloneNotSupportedException
异常。而Cloneable 接口只是规定并没有需要具体实现的函数。clone()函数并不是Cloneable接口需要实现的函数。
Cloneable接口:
重写clone() 函数,并实现Cloneable接口的例子:
public class CloneExample implements Cloneable {
private int a;
private int b;
private int[] arr;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
默认实现的是浅拷贝,如果想深拷贝arr指向的数组,则需要这样写:
@Override
protected CloneExample clone() throws CloneNotSupportedException {
CloneExample result = (CloneExample) super.clone();
result.arr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
result.arr[i] = arr[i];
}
return result;
}