热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaHashcode实际应用场景

Hashcode实际应用场景HashcodepublicinthashCode()以前一直觉得几乎不太可能会用到hashcode,所以一直写bean没有覆盖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是一个实体类,属性有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> map =new HashMap>();

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 list = map.get(user);
list.add(no);
map.put(user, list);
}
else{
LinkedList list = new ArrayList();
list.add(no);
map.put(user, list);
}
}
for (Iterator 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();
}

}
}



推荐阅读
author-avatar
mobiledu2502871951
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有