java Hashcode实际应用场景
2015-07-19 22:13
573 查看
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(); } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- Python中map()函数浅析
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树