在jdk1.7中,新增了一个工具类,就是java.util.Objects
类。它有3个简单的封装方法,对于平常的使用来说挺有用的,分别是:hashCode
、equals
、toString
这3个方法。
1、hashcode生成
1 | // 1. Objects.hash(Object... values) |
首先,Objects的hash方法接收可变参数,可变参数的内部是一个数组。然后内部调用Arrays的hashCode方法,我们来看一下其方法:核心是遍历每一个参数来计算result值,在计算的过程中,每一个参数上转型为Object使用hashCode来生成随机值。那么Object的hashCode又是什么?这是一个本地方法,源码不给出实现,其数值和对象的内存地址有关。
参数虽然上转型为Object,但是对于String、Integer等对象类型,它们都重写了hashCode方法。
因为是基于内存地址的生成,所以不同对象生成的hashcode值冲突的几率是很小的。
2、对象equals比较
1 | // 1. Objects.equals(Object a, Object b) |
首先是对象的引用判断,其次就是调用对象自身的equals方法来比较,如果对象类型没有重写equals的话,就会调用Object的equals方法(仍然是对象的引用比较)。
事实上,我们进行equals比较的对象,除了引用对象之外,就是String、Integer(自动装箱后)等类型了。
对于String,直接进行引用比较。而对于Integer、Double等对象类型,它们都重写了equals方法,贴出Integer的equals方法:
1
2
3
4
5
6
7 > public boolean equals(Object obj) {
> if (obj instanceof Integer) {
> return value == ((Integer)obj).intValue();
> }
> return false;
> }
>
可以看到,内部是进行值相等判断。
hashCode与equals方法的重要性
对于散列结构(hash)的集合类型,比如说HashMap、HashSet等,如果我们用它们来存储我们自定义的对象,那么我们就必要重写类的hashCode与equals方法。为什么要重写,这个原因就不赘述了。 还有Set集合类,由于它存储不重复的元素。
下面我们给出利用Objects工具类的一种较为简单实用的重写方式:
1 | public class Building { |
3、toString
我们自己重写toString方法时,有一点比较难写,就是默认值设置。
1 | // Objects.toString(Object o, String nullDefault) |
我们在重写toString时,可以参考上面的Building
类的写法。