equal&==&hashcode
2016-08-30 08:31
225 查看
== 和 equals 的区别
Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。
“==”比”equal”运行速度快,因为”==”只是比较引用.
hashcode 和 equals 的具体实现方式
默认 equals 方法直接调用了 ==
public boolean equals(Object obj) {
return (this == obj);
}
String 改写了 equals
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
hashCode是根类Obeject中的方法。默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的32为JVM内存地址。
String类源码中重写的hashCode方法如下:
public int hashCode() {
int h = hash; //Default to 0 ### String类中的私有变量,
if (h == 0 && value.length > 0) { //private final char value[]; ### Sting类中保存的字符串内容的的数组
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
总结:
(1)绑定。当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
(2)绑定原因。Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。同(1),必须保证equals相等的对象,hashCode 也相等。因为哈希表通过hashCode检索对象。
(3)默认。==默认比较对象在JVM中的地址。hashCode 默认返回对象在JVM中的存储地址。equal比较对象,默认也是比较对象在JVM中的地址,同==
Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。
“==”比”equal”运行速度快,因为”==”只是比较引用.
hashcode 和 equals 的具体实现方式
默认 equals 方法直接调用了 ==
public boolean equals(Object obj) {
return (this == obj);
}
String 改写了 equals
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
hashCode是根类Obeject中的方法。默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的32为JVM内存地址。
String类源码中重写的hashCode方法如下:
public int hashCode() {
int h = hash; //Default to 0 ### String类中的私有变量,
if (h == 0 && value.length > 0) { //private final char value[]; ### Sting类中保存的字符串内容的的数组
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
总结:
(1)绑定。当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
(2)绑定原因。Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。同(1),必须保证equals相等的对象,hashCode 也相等。因为哈希表通过hashCode检索对象。
(3)默认。==默认比较对象在JVM中的地址。hashCode 默认返回对象在JVM中的存储地址。equal比较对象,默认也是比较对象在JVM中的地址,同==
相关文章推荐
- What's the effect of hashCode() & equals() when adding object to List/Set/Map
- hashCode equal避免的几个误区
- equal() and hashCode()方法
- hashcode & equals
- [主席树维护HASH && SET维护DFS序] Codechef. Walks on the binary tree
- hashcode&equals续
- equal、hashcode ==
- equals&&hashCode&&toString函数
- 谈谈hashCode&equals&HashMap
- Codeforces round 244(div.2) D match&catch【字符串hash】
- Equals&nbsp;和&nbsp;hashcode&nbsp;经典代码
- java hashcode()和equal()方法比较
- Lombok(1.14.8) - @Getter, @Setter, @ToString, @EqualsAndHashCode & @Data
- hashCode equal避免的几个误区
- 基础加强____【哈希表数据结构】【深入理解hashcode & equals】
- Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long
- [分治 杂题] Codeforces Gym 101173 CERC 16 G & BZOJ 4792 Geohash Grid
- OC中自定义类的NSCopying实现的注意事项(isEqual & hash实现)
- hashcode & equals通俗理解
- java 中的hashcode&equals