java中对equals hashcode的理解
2012-12-17 00:00
495 查看
如果要比较实际内存中的内容,那就要用equals方法,但是!!!
如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。
那为什么我们用的String等等类型equals是比较实际内容呢,是因为String等常用类已经重写了object中的equals方法,让equals来比较实际内容。
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。
你 想通过一个object的key来拿hashmap的value,hashmap的工作方法是,通过你传入的object的hashcode在内存中找地 址,当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。
所以这里要匹配2部分,hashcode和equals
但 假如说你new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永 远不同的,所以我们要重写hashcode,你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的 hashcode来找到key的地址,然后你要重写你的equals方法,使内存中的内容也相等。。。
下面我测试一个简单的例子
当没有重写hashCode时的输出结果:
false
[天空游戏:www.tkyouxi.com, Hellow]
从 结果中可以看到c.remove(new Name("天空游戏","www.tkyouxi.com"))的反回结为fale;这个就是说明了c中的Name对像和要remove时new对像不 equals.现在我们把30,31,32的注释去掉再来运行一下。下面是输出结果:
true
[Hellow]
可以看到c里的Name对像被remove掉了。所以在当对像用在hashmap,hashset等集合类时要对equals与hashCode进行重写。
如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。
那为什么我们用的String等等类型equals是比较实际内容呢,是因为String等常用类已经重写了object中的equals方法,让equals来比较实际内容。
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。
你 想通过一个object的key来拿hashmap的value,hashmap的工作方法是,通过你传入的object的hashcode在内存中找地 址,当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。
所以这里要匹配2部分,hashcode和equals
但 假如说你new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永 远不同的,所以我们要重写hashcode,你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的 hashcode来找到key的地址,然后你要重写你的equals方法,使内存中的内容也相等。。。
下面我测试一个简单的例子
import java.util.*; public class Elins { public static void main(String[] args){ Collection c =new HashSet(); c.add("Hellow"); c.add(new Name("天空游戏","www.tkyouxi.com")); System.out.println(c.remove(new Name("天空游戏","www.tkyouxi.com"))); System.out.println(c); } } class Name{ private String c; private String d; public Name(String a,String b){ this.c=a; this.d=b; } public String toString(){ return c+":"+d; } public boolean equals(Object object){ return true; } // public int hashCode(){ // return c.hashCode(); // } }
当没有重写hashCode时的输出结果:
false
[天空游戏:www.tkyouxi.com, Hellow]
从 结果中可以看到c.remove(new Name("天空游戏","www.tkyouxi.com"))的反回结为fale;这个就是说明了c中的Name对像和要remove时new对像不 equals.现在我们把30,31,32的注释去掉再来运行一下。下面是输出结果:
true
[Hellow]
可以看到c里的Name对像被remove掉了。所以在当对像用在hashmap,hashset等集合类时要对equals与hashCode进行重写。
相关文章推荐
- 理解Java中的hashCode和equals方法
- 深入理解Java 中hashcode() 和equals()方法
- Java:equals和hashCode的理解
- java中对equals hashcode的理解
- Java中的equals和hashCode方法理解
- C# 中的 == 和 equals()有什么区别?/java中==和equals和hashCode的理解
- java中“==”和equals()以及hashCode()的理解
- 对java中equals和hashCode函数的一些理解
- 理解Java中的hashCode 和 equals 方法
- 对java中equals和hashCode函数的一些理解
- java equals()和hashcode()方法的理解
- 理解Java中的hashCode 和 equals 方法
- Java中的equals 和hashCode的理解
- 理解java中==、equals()、hashCode()
- 对java中equals和hashCode函数的一些理解
- java基础:equals() 和 hashCode()的一些理解
- 对java中equals和hashCode函数的一些理解
- Java中==、equals()、hashcode()三者的理解
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- Java中equals与hashcode