菜鸟话Java---Object详解

Object

Object类是Java中所有类(不包括基本数据类型)的超类,在Java中每个类都是由它扩展而来的。如果没有明确指出超类,Object就被
认为是这个类的超类,所以不需要这样显式声明:

1
2
3
public Animal extends Object{

}

所有的数组类型,不管是对象数组还是基本类型的数组都扩展Object

Object中的常用方法介绍

equals

Object中的equals方法用来检测一个对象是否等于另一个对象。在Object类中
这个方法将判断两个对象是否具有相同的引用。不过一般情况下,这种方式没有用。比如在
现实中我们通常通过比较id的方式来判断员工是否是同一个人。所以,我们都要重写
Object的equals方法。例如:

1
2
3
4
5
6
7
8
9
10
11
public class Employee {

private String id;

...

@Override
public boolean equals(Object obj) {
return id.equals(obj);//String中重写了Object的equals方法,它会比较两个字符串中所有字符是否相等
}
}

equals方法应该具有的特性:

  • 自反性:对于任何非空引用x,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)应该返回相同的值
  • 对于任何非空引用x,x.equals(null)应该返回false

处理继承问题

使用instanceof,例如:

1
if(!(other instanceof Animal))return false;

不过考虑一下这样的情况:

A是B的父类,如果B中重写了equals方法,如下

1
if(!(other instanceof B))return false;

由于:

1
2
A instanceof B 返回 false
B instanceof A 返回 true

所以:

1
2
B.equals(A);返回 false
A.equals(B);返回 true

不符合对称性。要使符合对称性,就必须让父类的equals方法为final.

使用getClass,不检测继承关系。getClass方法只有当两个引用来自同一类时,才会返回true。例如:

1
2
3
4
5
6
7
B.getClass() == A.getClass() 返回false

A.getClass() == B.getClass() 返回false

A.getClass() == A.getClass() 返回true

B.getClass() == B.getClass() 返回true

编写equals()方法的建议:

  1. 显式参数命名为otherObject
  2. 检测thisotherObject是否引用同一个对象。例如:if(this == otherObject)return true;,使用这个就行优化,由于
    计算这个等式要比一个一个比较类中的域所付出的代价要小得多。
  3. 检测otherObject是否为null.例如if(otherObject == null) return false;
  4. 比较thisotherObject是否属于同一个类:

    如果equals被子类覆盖,那么应该使用getClass()

    如果所有的子类都拥有统一的语义,就使用instanceof.
  5. otherObject转化为相应类类型的变量ClassName other = (ClassName)otherObject
  6. 对所有需要比较的域就行比较。基本类型使用==,对象域使用equals.

hashCode

散列码(hash code)是由对象导出的一个整数值。散列码是没有规律的。如果x和y是两个不同的
对象,x.hashCode()y.hashCode基本不会相同。

hashCode()没被覆写时,默认是返回对象的储存地址。

重写hashCode()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Employee {

private String id;

private String name;

...

@Override
public int hashCode() {
return name.hashCode()+id.hashCode()*5;
}
}

注意:equalshashCode的定义必须一致:如果x.equals(y)返回true那么x.hashCode()就必须等于y.hashCode()

toString

toString方法用来返回对象值的字符串.

Objects

Objects是一个工具类,它提供了很多实用方法,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int compare(T a, T b, Comparator c)
如果参数相同,则返回0,否则返回c.compare(a,b)。因此,如果两个参数都为null,则返回0。

boolean deepEquals(Object a, Object b)
检查两个对象是否相等。如果两个参数都相等,则返回true。否则,它返回false。如果两个参数都为null,则返回true

boolean equals(Object a, Object b)
比较两个对象是否相等。如果两个参数相等,则返回true。否则,它返回false。如果两个参数都为null,则返回true

int hash(Object... values)
为所有指定的对象生成哈希码。它可以用于计算对象的哈希码,该哈希码基于多个实例字段。

int hashCode(Object o)
返回指定对象的哈希码值。如果参数为null,则返回0。

boolean isNull(Object obj)
如果指定的对象为nullisNull()方法返回true。否则,它返回false。您还可以使用比较运算符==检查对象是否为null,例如,obj == null返回obj的truenull

boolean nonNull(Object obj)
执行与isNull()方法相反的检查。

T requireNonNull(T obj)
T requireNonNull(T obj, String message)
T requireNonNull(T obj, Supplier messageSupplier)
检查参数是否为null。如果参数为null,它会抛出一个NullPointerException异常。此方法设计用于验证方法和构造函数的参数。
第二个版本可以指定当参数为null时抛出的NullPointerException的消息。
第三个版本的方法将一个Supplier作为第二个参数。

String toString(Object o)
String toString(Object o, String nullDefault)
如果参数为null,则toString()方法返回一个“null”字符串。对于非空参数,它返回通过调用参数的toString()方法返回的值。