Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java.util.Date作为键存储在基于引用相等性的映射中,而不是“0”;“价值”;平等_Java_Date_Dictionary_Collections - Fatal编程技术网

将java.util.Date作为键存储在基于引用相等性的映射中,而不是“0”;“价值”;平等

将java.util.Date作为键存储在基于引用相等性的映射中,而不是“0”;“价值”;平等,java,date,dictionary,collections,Java,Date,Dictionary,Collections,我想构建一个日期对象的HashMap,这样每当我有两个不同的日期对象具有相同的日期值(日、月、年等等),HashMap就不会用新的值替换过去的值 例如: Date x = new Date(); Date y = new Date(); HashMap<Date,Integer> hm = new HashMap<Date,Integer>(); hm.put(x,1); hm.put(y,3); System.out.

我想构建一个日期对象的HashMap,这样每当我有两个不同的日期对象具有相同的日期值(日、月、年等等),HashMap就不会用新的值替换过去的值

例如:

    Date x = new Date();
    Date y = new Date();

    HashMap<Date,Integer> hm = new HashMap<Date,Integer>();
    hm.put(x,1);
    hm.put(y,3);

    System.out.println(hm.get(x));
    System.out.println(hm.get(y));
datex=新日期();
日期y=新日期();
HashMap hm=新的HashMap();
hm.put(x,1);
hm.put(y,3);
System.out.println(hm.get(x));
系统输出println(hm.get(y));
在本例中,它们都打印3。我想确保他们先打印1,然后打印3

我考虑过将键值放在Hashmap中作为每个日期的对象引用(因为它们是不同的),那么如何强制对象这样做呢

或者有更好的方法吗?

您应该使用此任务。这样,您可以使
等于
,但在
地图中有不同的对象

编辑: 你的例子是:

Date x = new Date();
Date y = new Date();

Map<Date,Integer> hm = new IndentityHashMap<Date,Integer>();
hm.put(x,1);
hm.put(y,3);
assert hm.size() == 2: hm.size();
datex=新日期();
日期y=新日期();
Map hm=新的身份hashmap();
hm.put(x,1);
hm.put(y,3);
断言hm.size()==2:hm.size();
正如@BoristheSpider所指出的,当您失去对原始对象的引用时,这可能不是最好的数据结构。在这种情况下,
MultiMap
(类似的)或
Entry
s/
对的
s/
元组的
列表可能是更好的选择,具体取决于用例。(前者用于希望属于某些
等于
键的所有值的情况,后者用于访问所有键/值对,但不按键搜索。)


如果您只想将
映射
用作对某些或所有(存储的)键进行随机访问的“数组”,那么
标识hashmap
是一个不错的选择。

更好的解决方案是使用唯一的时间戳。这将确保您可以通过具有相同的时间戳来检索该值

private static final AtomicLong MILLIS = new AtomicLong();

public static Date newDate() {
    long now = System.currentTimeMillis();
    for(;;) {
        long prev = MILLIS.get();
        if (prev >= now)
            now = prev + 1;
        if (MILLIS.comapreAndSet(prev, now))
            return new Date(now);
    }
}
如果使用此日期工厂,则每个数据都将是唯一的,并且尽可能接近实际时间

Date x = newDate();
Date y = newDate();

Map<Date,Integer> hm = new HashMap<>();
hm.put(x,1);
hm.put(y,3);

System.out.println(hm.get(x));
System.out.println(hm.get(y));
datex=newDate();
日期y=新日期();
Map hm=新的HashMap();
hm.put(x,1);
hm.put(y,3);
System.out.println(hm.get(x));
系统输出println(hm.get(y));

请阅读您的问题,然后再次尝试重写。我无法理解您想要什么您的
HashMap
有什么价值?您如何将它们视为两个唯一的对象?您是否正在寻找允许重复键的映射?HashMap是否未按预期工作?Date.hashCode和equals应该定义良好。您可以转储映射的
entrySet()
。这两个日期对象将生成相同的日期,x和y将相同。@AerRayes注意,如果丢失原始引用,您将永远无法从
IdentityHashMap
检索
对象。@Boristeider我认为您可以循环通过
entrySet()
/
键集()
,并重新获得原始引用。@GáborBakos,前提是您找到了想要重新获得的内容。你如何检查哪一个是原始引用,而不与之进行比较?@GáborBakos,我知道。但看看OPs示例—问题在于
Date
对象都是
.equals
,这正是
哈希映射
不起作用的原因。因此,如果您的评论有任何优点,那么
IdentityHashMap
是错误的构造。或者使用Java 8中的and
Instant
类(如果可能)-它具有纳米精度,因此应该提供唯一性。@Boristespider应该但可能不会在具有微秒分辨率的系统上。@PeterLawrey我认为不应该只存储新的
日期。在高度并发的场景中,很难有效且正确地调整日期以存储。它也会修改日期。你认为这是一个明智的选择吗?即使您有原始
日期的参考,也无法获取值。也许我误解了你的建议。@GáborBakos我认为是一个很好的选择,这就是为什么我建议它。它可以存储所需的数据,并且是高度并发的,尽管每秒有1000个以上的日期是个问题。如果您使用原始的
Date
对象,则可以使用这些对象作为键,这就是为什么我声称我提供的代码示例可以工作的原因。