一个使用了SSH的web项目,
Class Aa{
private String aa1;//数据库中对应的aa表的主键
private String aa2;
private String aa3;
//setter getter方法省略}List list = op.retrieveObjs(hql);//Op是一个hibernate的封装工具包
List list2 = new ArrayList();
for(int i=0;i<list.size();i++){
Aa aa=(aa)list.get(i);
aa.setAa1("");
System.out.println(aa.hashCode());
list2.add(aa);
}这样的话控制台打印出来的所有hashcode都是一样的,但是在debug模式中,list中的元素除了aa1属性被手动设置成了空,其他属性还是不一样的,而且将aa.setAa1("")的aa1替换成aa2,aa3的话,打印出来的hashcode就不一样了
请问java的hashcode是如何计算的,为什么只要aa1属性一样,hashcode就一致,忽略了其他属性
Class Aa{
private String aa1;//数据库中对应的aa表的主键
private String aa2;
private String aa3;
//setter getter方法省略}List list = op.retrieveObjs(hql);//Op是一个hibernate的封装工具包
List list2 = new ArrayList();
for(int i=0;i<list.size();i++){
Aa aa=(aa)list.get(i);
aa.setAa1("");
System.out.println(aa.hashCode());
list2.add(aa);
}这样的话控制台打印出来的所有hashcode都是一样的,但是在debug模式中,list中的元素除了aa1属性被手动设置成了空,其他属性还是不一样的,而且将aa.setAa1("")的aa1替换成aa2,aa3的话,打印出来的hashcode就不一样了
请问java的hashcode是如何计算的,为什么只要aa1属性一样,hashcode就一致,忽略了其他属性
会自动生成一段计算的代码,你可以试试看
用这种方法生成hashCode()后打印出来的hashcode就不一样了,也就是jdk实现的方法跟生成的方法是不一样的
hash的原理就不說了,自己去網上找找。class裡的hash大概會像這樣(自動產生)
如下當四個屬性都相同時,就會有相同的hash code,當資料不可重複的時候,就會用來識別。
public int hashCode() {
int hash = 5;
hash = 59 * hash + (this.jButton1 != null ? this.jButton1.hashCode() : 0);
hash = 59 * hash + (this.jScrollPane1 != null ? this.jScrollPane1.hashCode() : 0);
hash = 59 * hash + (this.jTable1 != null ? this.jTable1.hashCode() : 0);
hash = 59 * hash + (this.mainPanel != null ? this.mainPanel.hashCode() : 0);
return hash;
}
你可以決定那些值相同,就讓兩個物件視為些同物件,在 Set 或排序或DB資料一致性上是很重要的功能。
例如 DB 常常只用primary key當hash。