Object类中的主要方法
在Java中,只有基本类型不是对象,例如,数值、字符和布尔类型的值都不是对象。所有的数组类型,不管是对象数组还是基本类型的数组都扩展了Object类。
1. equals()方法
Java语言规范要求equals方法具有下面的特性:
-
自反性:x.equals(x); // true
-
对称性:x.equals(y) == y.equals(x);//true
-
传递性:
if(x.equals(y) && y.equals(z)){ x.equals(z);//true }
-
一致性:多次调用equals方法结果不变。反复调用x.equals(y)应该返回相同的结果。
-
对任意非空引用x,x.equals(null)应该返回false。
下面给出一个编写equals方法的例子:
public boolean equals(Object other){
if(this == other){
return true;
}
if(other == null){
return false;
}
if(getClass() != other.getClass()){
return false;
}
Employee o = (Employee) other;
return field1 == o.field1 && Objects.equals(field2, o.field2) && ...;
}
2.hashCode方法
hashCode()方法的作用:根据一定的规则将对象相关的信息(比如对象的存储地址、对象的字段等)映射成一个数值(int类型),这个数值称作为散列值。hashCode方法就是返回散列值。
由于hashCode()方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。
等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价。例如:
对象 | 散列码 |
---|---|
s | 2556 |
sb | 20526976 |
t | 2556 |
st | 20527144 |
注意:字符串s和t 拥有相同的散列码,这是因为字符串的散列码是由内容导出的。而字符串缓冲sb、tb却有着不同的散列码,这是因为在StringBuffer类中没有定义hashCode方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。
3.toString()方法
随处可见同toString()方法的主要原因是:只要对象与一个字符串通过操作符 “+” 链接起来,Java编译就会自动地调用toString()方法,以便获得这个对象的字符串描述。例如:
Point p = new Point(10, 20);
String message = "The current position is:" + p;
在调用x.toString()的地方可以用 “” + x 代替。这条语句将一个空串与x的字符串表示相连接。这里的x就是x.toString()。与toString()不同的是,如果x是基本类型,这条语句照样能够执行。
如果x是任意一个对象,并调用System.out.println(x); println方法就会直接地调用x.toString(),并打印输出得到的字符串。
Object类定义了toString方法,用来打印输出对象所属的类名和散列码。
### 4.clone()方法浅析