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类)
- 比较this与other是否是同一个对象,若是返回true
- 检测other是否为空,若是返回false;
- 是否同属于一个Class/是否同属于一个父类,不是则返回false。此条是按需求选的,例如:如果有需求认为两个类的id域相同就认为相等,就不用满足这个同类条件。
- 比较具体的域。
注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)
浙公网安备 33010602011771号