HashMap|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;
}

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

@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;
}
}

    推荐阅读