java中测试两个变量是否相等有两种方式:一是利用==运算符,另一种是利用equals()方法。
==:判断两变量是否相等,若两变量都为基本类型,且都是数值类型(不一定要求数据类型严格相同),只要值相等就返回true;
比较两个引用型变量,只有它们指向同一个对象,才返回true。
equals():Object类提供的一个实例方法(hashcode()也是)因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等。但,没有经过重写的equals()和==没有任何区别,所以很多时候需要重写。在String类中,equals()已经重写过:只要两个字符串字符序列相同,就返回true。
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。
equals与hashcode间的关系是这样的:
equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,它们的hashcode()不一定相等
之所以这样设计是为了在Map中更快的查找到对象(相对于线性搜索);
一般Map都设计成数组+链表的结构,使用hashcode去查找对象需要两个步骤,首先使用hashcode定位数组下标索引,然后遍历该数组元素对应的链表,找到equals的元素;
Object默认的hashcode实现对于不同的对象会返回不同的值,因此,在上面那个例子中,不同的对象(即使同一个类型)有着不同的hashcode;
值的散列就像在车库储存货物,不同的货物能被存放到不同的车库。比较有效查找货物办法是将不同的货物存到不同的车库中,而不是同一个车库;
所以将hash值尽可能的分散是一个比较好的策略。