Java Object 类常用方法

版权声明:本文为博主原创文章,转载请注明出处。 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;
}

猜你喜欢

转载自blog.csdn.net/OOC_ZC/article/details/84062549