Java equals()和hashCode()的作用

Object的方法 equals()和hashCode() 是用来判断两个对象是否相等。基础类型判断是否相等时,使用“==”来判断,按java的说话,“==”当用来判断是基础类型是判断内容的,而引用对象是判断内存地址的。一般情况我们之间继承Object的默认方法是可以的。但是,某些情况是要我们Override的。特别是在处理java集合时。按java的集合分类:List,Set,Map 其中List是有序的,可以有重复项的。如ArrayList。Set 是无序的并且不允许有重复项的。Map 是个键值对,也是对key有要求的。这边主要说Set因为他不允许重复项。

当我们使用自定义类型时,在add到Set时,就需要我们自己处理一下对象是否相等的情况。一般情况下,我们多是使用下面类似的代码

		UserInfo i1=new UserInfo("zz",11);
		UserInfo i2=new UserInfo("zz",11);
		
		
		Set s=new HashSet();
		s.add(i1);
		s.add(i2);
		//判断i1的内容是否和i2的相等
		System.out.println( i1.equals(i2));
		//i1的hashCode
		System.out.println( i1.hashCode());
		//i2的hashCode
		System.out.println( i2.hashCode());
		//S 集合的元素个数
		System.out.println(s.size());

其中UserInfo 是我们自定义类型。具体定义如下

public class UserInfo {

	private String userName;
	private int userAge;
	
	public UserInfo(String userName, int userAge) {
		super();
		this.userName = userName;
		this.userAge = userAge;
	}

	@Override
	public boolean equals(Object obj)
	{
		if(obj==this)
			return true;
		UserInfo userinfo=(UserInfo)obj;
		if(userName.equals(userinfo.getUserName()) && userAge==userinfo.getUserAge())
			return true;
		return false;
	}
	
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		//return super.toString();
		return "UserInfo UserName:"+getUserName()+"UserAge:"+getUserAge();
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public int getUserAge() {
		return userAge;
	}
	public void setUserAge(int userAge) {
		this.userAge = userAge;
	}
	
}

请注意,UserInfo 我并没有Override hashCode这个函数,只是重写了equals。所以第一步的代码输出结果是

true  //i1和i2的内容是相等
33263331 //i1的hashCode
6413875 //i2的hashCode
2 //s的元素个数

默认情况 是我们要同时重写 equals和hashCode的函数。要不就会出现上面的情况,按规定两个值的内容相等的对象应该就是同一个对象(这个话可能会有歧义)。也就是 hashCode相等 一定是同一个对象。但是反之缺不一定。

Set  集合是按hashCode来判断对象是否相等的。所以,我们要重写 hashCode 如下:

	@Override
	public int hashCode()
	{
		final int offer=31;
		
		return userAge*userName.hashCode()*offer;
		
	}

其实好对人对java默认的hashCode 不是太明白为啥要那么复杂,其实就是按自己的一个规则生成一个int值就行。

当我们复写了hashCode以后,马上我们的输出结果就不一样了。

true
1331264
1331264
1

这样就达到了我们的目的了。内容相同就应该hashCode也一样。这样Set add的时候就只会插入一个,另一个会自动过滤掉。并不会出异常。这点需要注意一下。

基本说完了。发个牢骚,就因为这个问题,完美世界的某个黄XX程序经理装B一样一直问我,鄙视这样的SB,这样的东西只要做过一次就不会有太大的问题。他还当发明原子弹一样高深的来问。干。

转载于:https://www.cnblogs.com/yoyozhou/archive/2012/02/25/2367829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值