为什么不能使用instanceof呢?
因为当一个类与它的子类进行比较时,用instanceof方法返回的也是true
为什么不全部使用==进行比较呢?
比较时,要求基本类型相等,引用类型需要使用java.util.Objects类的equals静态方法进行对比
在equals方法没被修改的前提下,多次调用同一对象的hashcode方法返回的值必须是相同的整数
如果两个对象互相equals,那么这两个对象的hashcode值必须相等
为不同对象生成不同的hashcode可以提升哈希表的性能
为什么使用31作为基数呢?
基数要用是质数,每个对象根据值计算HashCode,这个code大小虽然不奢求必须唯一,但是要尽可能的不要重复,因此基数要尽量的大,并且31只占用5bits。所以从效率上,31是2的5次减1,对计算机来说2的乘除操作只需要做位移操作(1<<5 - 1)。 也就是说31对计算机的角度来说运算更快、切占内存不多不少,而且形成惯例,虚拟机甚至都专门对他做了优化。