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;
}
}
推荐阅读
- HashMap&ConcurrentHashMap&HashTable
- HashMap负载因子
- Java8|Java8 中的 HashMap 和 ConcurrentHashMap 全解析
- HashMap源码详解一篇就够
- JAVA常见的技术面试问题(3)
- ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)
- 面试突击19(为什么ConcurrentHashMap不允许插入null值())
- 面试突击17(HashMap除了死循环还有什么问题())
- HashMap的实现原理(看这篇就够了)
- HashMap计算key索引算法为什么是hash(key)&(n = table.length - 1)