0 0

谁能给我讲讲 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]
OO 
2011年1月15日 22:41

2个答案 按时间排序 按投票排序

0 0

采纳的答案

一个例子,,看下吧。。如果屏蔽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
0 0

这个问题,,对于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

相关推荐

Global site tag (gtag.js) - Google Analytics