大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > 浅谈Java中的hashcode方法

浅谈Java中的hashcode方法(2)

关键词:Javahashcode  阅读(1060) 赞(11)

[摘要]本文是对浅谈Java中的hashcode方法的讲解,对学习Java编程技术有所帮助,与大家分享。

  这样一来的话,输入后果就为“1”了。

  上面这段话摘自Effective Java一书:

  • 在顺序执行时期,只需equals办法的比拟操作用到的信息没有被修正,那么对这同一个对象调用屡次,hashCode办法必需不时如一地前往同一个整数。
  • 假定两个对象依据equals办法比拟是相等的,那么调用两个对象的hashCode办法必需前往相反的整数后果。
  • 假定两个对象依据equals办法比拟是不等的,则hashCode办法不一定得前往不同的整数。

  关于第二条和第三条很好了解,但是第一条,很多时分就会疏忽。在《Java编程思想》一书中的P495页也有同第一条相似的一段话:

  “设计hashCode()时最重要的要素就是:无论何时,对同一个对象调用hashCode()都应该发作异常的值。假定在讲一个对象用put()添加进HashMap时发作一个hashCdoe值,而用get()取出时却发作了另一个hashCode值,那么就无法获取该对象了。所以假定你的hashCode办法依赖于对象中易变的数据,用户就要留意了,由于此数据发作变化时,hashCode()办法就会生成一个不同的散列码”。

  上面举个例子:

  

package com.cxh.test1;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;


class People{
	private String name;
	private int age;
	
	public People(String name,int age) {
		this.name = name;
		this.age = age;
	}	
	
	public void setAge(int age){
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return name.hashCode()*37+age;
	}
	
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return this.name.equals(((People)obj).name) && this.age== ((People)obj).age;
	}
}

public class Main {

	public static void main(String[] args) {
		
		People p1 = new People("Jack", 12);
		System.out.println(p1.hashCode());
		
		HashMap<People, Integer> hashMap = new HashMap<People, Integer>();
		hashMap.put(p1, 1);
		
		p1.setAge(13);
		
		System.out.println(hashMap.get(p1));
	}
}

  这段代码输入的后果为“null”,想必其中的缘由大家应该都清楚了。

  因而,在设计hashCode办法和equals办法的时分,假定对象中的数据易变,则最好在equals办法和hashCode办法中不要依赖于该字段。

«上一页12下一页»


相关评论