-
谁能给我讲讲 equals 和 hashcode 的关系和应用5
当需要判断两个对象相等时候,一直听到说 ,有的时候要重写equals的同时要重写 hashcode方法,看不懂,求高人教教我,谢谢,最好有例子,越具体越好
问题补充:gbfd2012 写道这个问题,,对于List类数组中ArrayList的类型,它可以存储重复类型的数据。。只是equals比较判断了下,而对于不重复的数组类型,如HashSet为了区别判读数组的元素是否重复引入了hashcode......举个例子,,比如HashSet数组中有1000个互相不重复的数据,,,现在向数组中添加一个新的数据。如果进入比较的话需要比较1000次,,效率可想而知,。利用hashcode,,可以增加效率。。。减少比较的次数。
hashcode就好像是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。
一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。
最常用的地方就是在一堆东西里找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。
//一个不能加重复内容的容器
class Set {
Object[] objs = new Object[10]; //装东西的的数组
int size = 0; //已经有几个东西
//添加新东西,成功的话返回true,如果已经有了的话返回false
boolean add(Object o) {
for(int i=0;i<size;i++) { //搜索所有已经加进来的对象
if(objs[i].hashCode() == o.hashCode()) //如果hashcode一样的话就说明两个有可能是一样的
if(objs[i].equals(o)) return false; //仔细的确认一下是不是真的一样,如果一样的话就不加入这个对象
}
objs[size++]=o; //确认没有过这个东西,加入数组
return true;
}
}
当使用这个类的时候要确保两个一样的东西的hashcode肯定是一样的。两个不同的东西的hashcode可以是一样的,不过这样会减慢运行速度,所以尽量避免(也就是所谓的碰撞)。
---------------------------------------------------------------------------------
抱歉,再请问,那hashcode()这个方法要重写,该写点什么内容呢?怎么写呢?[color=red][/color]2011年1月15日 22:41
2个答案 按时间排序 按投票排序
-
采纳的答案
一个例子,,看下吧。。如果屏蔽public int hashCode()方法,,比较下。结果。
package Cs; import java.util.HashMap; import java.util.Map; public class Test2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Map map=new HashMap(); map.put(new PhoneNumber(020,1234567),"xx"); System.out.println(map.get(new PhoneNumber(020,1234567))); } private static class PhoneNumber{ /** * @param areaCode * @param extension */ public PhoneNumber(int areaCode, int extension) { this.areaCode =(short) areaCode; this.extension = (short)extension; } private short areaCode; private short extension; public boolean equals(Object o){ if(o==this){ return true; } if(!(o instanceof PhoneNumber)){ return false; } PhoneNumber pn=(PhoneNumber)o; return pn.extension==extension && pn.areaCode==areaCode; } //result就是我们得到的散列值,,计算过程有多种,这里只是个例子 public int hashCode(){ int result=17; result=37*result+areaCode; result=37*result+extension; return result; } } }
2011年1月17日 14:50
-
这个问题,,对于List类数组中ArrayList的类型,它可以存储重复类型的数据。。只是equals比较判断了下,而对于不重复的数组类型,如HashSet为了区别判读数组的元素是否重复引入了hashcode......举个例子,,比如HashSet数组中有1000个互相不重复的数据,,,现在向数组中添加一个新的数据。如果进入比较的话需要比较1000次,,效率可想而知,。利用hashcode,,可以增加效率。。。减少比较的次数。
hashcode就好像是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。
一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。
最常用的地方就是在一堆东西里找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。
//一个不能加重复内容的容器
class Set {
Object[] objs = new Object[10]; //装东西的的数组
int size = 0; //已经有几个东西
//添加新东西,成功的话返回true,如果已经有了的话返回false
boolean add(Object o) {
for(int i=0;i<size;i++) { //搜索所有已经加进来的对象
if(objs[i].hashCode() == o.hashCode()) //如果hashcode一样的话就说明两个有可能是一样的
if(objs[i].equals(o)) return false; //仔细的确认一下是不是真的一样,如果一样的话就不加入这个对象
}
objs[size++]=o; //确认没有过这个东西,加入数组
return true;
}
}
当使用这个类的时候要确保两个一样的东西的hashcode肯定是一样的。两个不同的东西的hashcode可以是一样的,不过这样会减慢运行速度,所以尽量避免(也就是所谓的碰撞)。2011年1月16日 14:53
相关推荐
重写equals和hashcode方法,学习和进步
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
NULL 博文链接:https://jackosn-liao.iteye.com/blog/528757
NULL 博文链接:https://alpha2009.iteye.com/blog/570322
Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)
关于hashCode()和equals()的本质区别和联系.doc
但是为什么JavaDoc明确的告诉我们, hashCode()和equals()要一起重写呢?原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点...
关于重写equals,hashcode以及compareTo方法!
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
hashcode()和equals() 博客地址:https://blog.csdn.net/qq_36963950/article/details/107543471
如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
更清楚的了解hashcode()和equals()方法。
今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧
NULL 博文链接:https://zpointer.iteye.com/blog/1058337