Object类是Java中所有类的超类,每个类都是由Object继承而来。在Java中,只有基本类型(int,double,boolean等)不是对象,所有的数组类型,不管是对象数组还是基本类型的数组都是扩展Object类。Object类包含以下方法:
equals方法
在Object类中的equals方法用于检测一个对象是否等于另外一个对象。equals默认判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。为了防备调用对象为null的情况,可以使用Objects.equals方法。如果两个参数都为null,Object.equals(a,b)方法调用将返回true;如果其中一个参数为null,则返回false;否则如果两个参数都不为null,则调用a.equals(b)。
Java 语言规范要求equals方法具有以下的特性:
- 自反性:对于任何的非空对象引用,x.equals(x)应该返回true。
- 对称性:对于任何的引用,x和y,x.equals(y)返回true,则y.equals(x)也应该返回true。
- 传递性:对于任何的引用,x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也返回true。
- 一致性:如果x和y的引用没有变化,则反复调用x.equals(y)应该返回true。
- 对于任意的非空引用:x.equals(null)应该返回false。
hashCode方法
public class HashCodeTest {
public static void main(String[] args) {
String ok1 = "OK";
String ok2 = new String("OK");
System.out.println(ok1.hashCode() + ":" + ok2.hashCode());
StringBuilder sb1 = new StringBuilder(ok1);
StringBuilder sb2 = new StringBuilder(ok1);
System.out.println(sb1.hashCode() + ":" + sb2.hashCode());
}
}
字符串ok1和ok2拥有相同的散列码,这是因为String重写了Object的hashcode方法,该方法中定义的字符串的散列码是由内容导出的。而字符串缓冲sb1和sb2却有着不同的散列码,这是因为在StringBuilder类中没有定义hashcode方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。
注意: equals与hashCode的定义必须一致,如果x.equals(y)返回true,那么x.hashCode就必须与y.hashCode具有相同的值。
toString方法
Object类中的toString方法用于返回表示对象值的字符串。只要一个对象与字符串通过操作符“+”连接起来,Java编译就会自动调用对象的toString()方法。
数组继承了Object类的toString()方法,因此数组类型的toString()方法是返回的数组的内存地址,此时我们可以使用Arrays的静态方法Arrays.toString方法打印出数组的内容,看如下代码:
public class ArrayTest {
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7};
System.out.println(nums);
System.out.println(Arrays.toString(nums));
}
}
输出结果: [I@12504e0
[1, 2, 3, 4, 5, 6, 7]