HashMap containsKey toString equals hashCode

HashMap containsKey toString equals hashCode
HashMap的key一般是自定义类,一定要重载toString、equals和hashCode方法,
这样才能使用HashMap.containsKey()方法判断是否包含该该键值,否则永远都是假!
这里要巧妙利用重载toString方法,来提供自定义类的唯一标识。

RecordNumber是自定义类,由3个字段组成,如果这3个字段都相同,就认为该类实例相同,
toString方法非常容易构造这种这个条件。

//如果 Main.hmMyDB 包含 Main.hmDS.keySet(),就不需要动作,不含就动作
System.out.println("需要压栈的任务是");
for (RecordNumber v_rn : Main.hmDS.keySet()) {
    if (!Main.hmMyDB.containsKey(v_rn)) {
        Main.taskStack.add(v_rn);
        System.out.println("压栈"+v_rn);
    } else {
        System.out.println("MyDB已经包含");
    }
}
       
  public boolean equals(Object O) {
    return (O instanceof MyClass) &&
      toString().equals(((MyClass)O).toString());
  }
 
//数据源 表名 时间 (记录数量)
public class RecordNumber {

    public final String DataSource;
    public final String TableName;
    public final Date DateTime;

    public RecordNumber(String DataSource, String TableName, Date DateTime) {
        this.DataSource = DataSource;
        this.TableName = TableName;
        this.DateTime = DateTime;
    }

    @Override
    public String toString() {
        return (this.DataSource + "**" + this.TableName + "**" + this.DateTime);
    }


    @Override
    public boolean equals(Object o) {
        return (o instanceof RecordNumber)
                && toString().equals(((RecordNumber) o).toString());
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + (this.DataSource != null ? this.DataSource.hashCode() : 0);
        hash = 37 * hash + (this.TableName != null ? this.TableName.hashCode() : 0);
        hash = 37 * hash + (this.DateTime != null ? this.DateTime.hashCode() : 0);
        return hash;
    }
}
 

你可能感兴趣的:(HashCode)