==和equals和hashcode是经常遇到但是很重要的内容,希望这篇文章能帮你理清概念。
在Java中有八种基本数据类型:float(4 byte), double(8 byte),byte(1 byte), short(2 byte), int(4 byte) , long(8 byte),char(2 byte),boolean。
对于这八种基本数据类型的变量,变量直接存储的是“值”。因此,在使用关系操作符 == 来进行比较时,比较的就是“值”本身。要注意的是,浮点型和整型都是有符号类型的(最高位仅用于表示正负,不参与计算【以 byte 为例,其范围为 -2^7 ~ 2^7 - 1,-0即-128】),而char是无符号类型的(所有位均参与计算,所以char类型取值范围为0~2^16-1)。
对于关系操作符 ==:
equals方法是基类Object中的实例方法,因此对所有继承于Object的类都会有该方法。「该方法本意是比较内容是否相同」。
Object类中equals方法的实现:
public boolean equals(Object obj) {
return (this == obj);
}
在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。
但是,String类重写了equals 方法:
public boolean equals(Object anObject) { // 方法签名与 Object类 中的一致
if (this == anObject) { // 先判断引用是否相同(是否为同一对象),
return true;
}
if (anObject instanceof String) { // 再判断类型是否一致,
// 最后判断内容是否一致.
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
String类使用equals方法,内部实现分为三个步骤:
Java 中所有内置的类的 equals 方法的实现步骤均是如此,特别是诸如 Integer,Double 等包装器类。
equals 重写原则:
在 Java 中,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数。(这是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧)。
HashCode 只是在需要用到哈希算法的数据结构中才有用,比如 HashSet, HashMap 和 Hashtable。
要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是 Object.equals 方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。 也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是,Java采用了哈希表的原理。 这样,我们对每个要存入集合的元素使用哈希算法算出一个值,然后根据该值计算出元素应该在数组的位置。所以,当集合要添加新的元素时,可分为两个步骤:
一般来讲,equals 这个方法是给用户调用的,而 hashcode 方法一般用户不会去调用,总结来说,「hashcode是系统用来快速检索对象而使用。」