为什么Map不能用Date作为键?

sup*_*che 0 java dictionary date treemap

当我创建一个我只是观察TreeMap基础上Date的一个键,按日期排序,如功能remove(Date key)containsKey(Date key)不即使日期是在地图以及目前的工作.此外,Date的equals函数运行良好.

那么,有谁知道为什么它不起作用?

我正在使用旧的Java 6u43,我创建了我的Map:

    Map<Date, Integer> hourMap = new TreeMap<Date, Integer>(new Comparator<Date>() {
        @Override
        public int compare(Date d1, Date d2) {
            return d1.after(d2) ? 1 : -1;
        }
    });
    Date now = DateUtils.parseDate("04:00:00", "HH:mm:ss");
    hourMap.put(now, 12);
    hourMap.remove(now); // doesn't work
    boolean test = hourMap.containsKey(now); // return false
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 6

问题不是日期,而是你破坏的比较器(例如,如果两个日期相等,则返回-1).为什么不使用默认的?

Map<Date, Integer> hourMap = new TreeMap<Date, Integer>();
Run Code Online (Sandbox Code Playgroud)

应该按预期工作.

作为参考,这是比较器在Date类中的实现方式(在Java 8中 - 不确定自Java 6以来它是否已更改):

long thisTime = getMillisOf(this);
long anotherTime = getMillisOf(anotherDate);
return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
Run Code Online (Sandbox Code Playgroud)