我想要一个 DateWrapper - 代表一个日期(为 Hibernate 持久性而构建,但这是另一个故事) - 最多在同一日期同时存在。
我对冲突和散列的好键有点困惑。我正在为一个DateWrapper
对象编写一个工厂,并且我想使用解析日期的毫秒数作为键,就像我看到其他人所做的那样。但是,如果发生碰撞会发生什么?. 毫秒总是彼此不同,但内部表可能小于可能存在的 Long。并且一旦哈希映射发生冲突,它就会使用等号,但是它如何区分两个不同的对象和我的 Long 呢?也许,这是删除(覆盖)一些我想插入的值的 put 方法......那么,这段代码是安全的,还是有问题?
package myproject.test;
import java.util.HashMap;
import java.util.Map;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import myproject.utilities.DateWrapper;
public class DateWrapperFactory {
static Map <Long, DateWrapper> cache = new HashMap<Long, DateWrapper>();
static DateTimeFormatter parser =
DateTimeFormat.forPattern("yyyy-MM-dd");
static DateWrapperFactory instance = new DateWrapperFactory();
private DateWrapperFactory() {
}
public static DateWrapperFactory getInstance() {
return instance;
}
public static DateWrapper get(String source) {
DateTime d = parser.parseDateTime(source);
DateWrapper dw = cache.get(d.getMillis());
if (dw != null) {
return dw;
} else {
dw = new DateWrapper(d);
cache.put(d.getMillis(), dw);
return dw;
}
}
}
package myproject.test;
import org.joda.time.DateTime;
public class DateWrapper {
private DateTime date;
public DateWrapper(DateTime dt) {
this.date = dt;
}
}