Java核心技术读书笔记5-2 Object类及其原生方法

2.Object类

2.1 Object类是所有类的始祖,包括数组和其他类

2.2 equals方法
对于Java,==是比较内存地址是否相同,其实,equals方法来自于Object,其原始含义也是比较内存地址

public boolean equals(Object obj) {
        return (this == obj);
    }

但这种形式与==的功能是一样的,一般意义不大。所以很多类库对equals方法进行了重写。重写后的equals方法一般用于比较对象的值是否相同,即变量中存的地址指向的对象的值是否相同。如String类的重写:

public boolean equals(Object anObject) {
        if (this == anObject) { //若是同一对象,值自然相同
            return true;
        }
        if (anObject instanceof String) { //若都是String才可比较,否则直接返回false
            String aString = (String)anObject;
            if (!COMPACT_STRINGS || this.coder == aString.coder) { //不是紧凑字符串或编码相同才可比较值,否则返回false
                return StringLatin1.equals(value, aString.value); //比较值
            }
        }
        return false;
    }

直接比较值是比较耗时的,因此,重写equals方法时应按如下步骤比较以提升效率。(既然是重写方法,参数类型一定只能是唯一的一个Object类)

  1. 比较this与other是否是同一个对象,若是返回true
  2. 检测other是否为空,若是返回false;
  3. 是否同属于一个Class/是否同属于一个父类,不是则返回false。此条是按需求选的,例如:如果有需求认为两个类的id域相同就认为相等,就不用满足这个同类条件。
  4. 比较具体的域。
    注1:在-128~127范围的整形包装类,使用字符串字面值的字符串对象,如果同值用==比较也会返回true。前者是因为JVM缓存,后者是因为字符串池。
    注2:数组类型可用Arrays.equals(type[] a, type[] b)方法检测数组元素,Objects.equals(Object a, Object b)方法可以检测两个对象是否为null,同null为true,若只有一方为null返回false,否则返回a.equals(b)

2.3 hashCode方法
散列码(hash code)是由对象导出的一个没有规律的整型值。在Object中hashcode方法默认放回对象的地址(也保证了和equals方法的返回结果一致)。若重写equals方法必须重写hashcode方法,一个对象的散列码必须和equals方法一致,即两个具有相同散列码的对象使用equals方法返回结果必须为true,反之亦然。
一些获得hashcode的方法:
Object.hashCode();
Objects.hash(objects...);
Objects.hashCode(Object obj);
基本类型包装类.hashcode(一个基本数据类型);
Arrays.hashCode(type[] array);

2.4 toString方法
一般会打印类名信息和域的值,若有超类还可以调用超类的toString方法和类信息。
打印一个变量或使用+连接了字符串时,系统会自动调用toString方法。
打印数组和二维数组元素可以使用Arrays.toString(type[] array)和Arrays.deepToString(type[][] array)

posted @ 2021-11-08 19:40  芝芝与梅梅  阅读(59)  评论(0)    收藏  举报