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();
}
}
}