java Hashcode实际应用场景

Hashcode实际应用场景

Hashcode

	public int hashCode()
以前一直觉得几乎不太可能会用到hashcode,所以一直写bean没有覆盖hashcode()方法

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:
此对象的一个哈希码值。


应用场景

1、涉及到重写equals()方法时,需要考虑到覆盖hashcode()方法
2、如果用对象作为map的键时,需要考虑到覆盖hashcode,以便提高或者达到自己的目的

举例:


假如要处理上述一个文件,是HDFS文件系统中的一个文件,数据量很大,是保存的每个顾客每天的消费记录,第一列是顾客编号,第二列是产品编号(前三位是产品种类),最后一列是购买日期,现在要将每个顾客每天购买的消费记录统计出来,如[0983485,105,406,108,109....],就是每个顾客每天所购买的产品种类。

为了处理这个问题,首先需要对每一行字符串进行切分,得到如【0983485,701,2015-06-19】
所以咱们定义一个HashMap<Flag,ArrayList<String>>
Flag是一个实体类,属性有username,time
主要是为了作为Map的一个主键,如果已经有这个键K,,那么Value则add(no)。这个时候需要考虑键的hashcode还有equals方法的覆盖》


详见代码:

public class Flag {

	private String no;
	private String time;
	public Flag(String no,String time){
		this.no = no;
		this.time = time;
	}
		
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	@Override  
    public boolean equals(Object o) {  
        if(o==null) return false;  
        if(!(o instanceof Flag)) return false;  
        if(this==o) return true;  
        Flag o2=(Flag)o;  
        if(no.equalsIgnoreCase(o2.no)  
            && time.equalsIgnoreCase(o2.time)  
            )  
            return true;  
        return false;  
    }  
	 @Override  
	public int hashCode(){
		 int result=17;  
	      result=31*result+no!=null?no.hashCode():0;  
	      result=31*result+time!=null?time.hashCode():0;  
	      //result=31*result+position!=null?position.hashCode():0;  
	      return result;  
	}
}

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import com.market.help.Flag;
import com.market.help.SqlOperation;

public class MapRS {

	 public static void readFromHdfs() throws FileNotFoundException,IOException {
		  String dst = "hdfs://master:9000/user/hive/warehouse/monthbuy_log/000000_0";  
		  Configuration conf = new Configuration();  
		  FileSystem fs = FileSystem.get(URI.create(dst), conf);
		  InputStream in=null;
		  BufferedReader buff=null;

		  in = fs.open(new Path(dst));
		
		  
		  buff=new BufferedReader(new InputStreamReader(in));
		  Flag user = new Flag();
		  String str;
		  Map<Flag,LinkedList<String>> map =new HashMap<Flag,LinkedList<String>>();
		  
		  String st[];
		
		  String no;
		  String sql = "";
		  
		  while((str=buff.readLine())!=null){
			  	//
			  System.out.println(str);
			  	st = str.split("\u0001");
			  	user.setNo(st[0]);
			  	no = st[1].substring(0, 3);
			  	user.setTime(st[5]);
			  	if(map.containsKey(user)){
			  		LinkedList<String> list = map.get(user);
			  		list.add(no);
			  		map.put(user, list);
			  	}
			  	else{
			  		LinkedList<String> list = new ArrayList<String>();
			  		list.add(no);
			  		map.put(user, list);
			  	}
			 }
		  for (Iterator<Flag> i = map.keySet().iterator(); i.hasNext();) {
			   Object obj = i.next();
			   System.out.println(obj);// 循环输出key
			   System.out.println("key=" + obj + " value=" + map.get(obj));
			  }
		  buff.close();
		  //hdfsInStream.close();
		  in.close();
		  fs.close();
		 }
	
	 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值