一个使用了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就一致,忽略了其他属性

解决方案 »

  1.   

    没研究过,不过你在Aa类里面右键——>Source——>Generate hashCode() and equals()
    会自动生成一段计算的代码,你可以试试看
      

  2.   


    用这种方法生成hashCode()后打印出来的hashcode就不一样了,也就是jdk实现的方法跟生成的方法是不一样的
      

  3.   

    hash cdoe 的目的是讓不同的資料有不同的索引值,而相同的資料索引值就相同。
    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。