Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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 每次使用.put()时,HashMap都会被重写_Java_Hashmap - Fatal编程技术网

Java 每次使用.put()时,HashMap都会被重写

Java 每次使用.put()时,HashMap都会被重写,java,hashmap,Java,Hashmap,我的申请与股票市场有关。我有一个feed,它不断地更新一个名为Price的对象。Price有一个HashMap,它存储安全代码字符串和Price Double。每次新价格出现时,此对象都会更新 该应用程序应该扫描价格,寻找大的变动。我有一个单独的类叫做Poller,它每秒轮询一次Price对象,并拍摄价格快照。快照是如上所述的哈希映射。然后我想把这个价格的HashMap和一个pollNumber一起存储在另一个HashMap中,我可以稍后传递pollNumber并得到与该pollNumber对应

我的申请与股票市场有关。我有一个feed,它不断地更新一个名为Price的对象。Price有一个HashMap,它存储安全代码字符串和Price Double。每次新价格出现时,此对象都会更新

该应用程序应该扫描价格,寻找大的变动。我有一个单独的类叫做Poller,它每秒轮询一次Price对象,并拍摄价格快照。快照是如上所述的哈希映射。然后我想把这个价格的HashMap和一个pollNumber一起存储在另一个HashMap中,我可以稍后传递pollNumber并得到与该pollNumber对应的时间的价格

但是,我得到的是之前所有的价格被覆盖,输出与下面类似

0:{MSFT=17.67,AAPL=93.85,GOOG=333.86} {0={MSFT=17.67,AAPL=93.85,GOOG=333.86}

1:{MSFT=17.64,AAPL=93.85,GOOG=334.02} {0={MSFT=17.64,AAPL=93.85,GOOG=334.02},1={MSFT=17.64,AAPL=93.85,GOOG=334.02}

2:{MSFT=17.64,AAPL=93.85,GOOG=334.08} {0={MSFT=17.64,AAPL=93.85,GOOG=334.08},1={MSFT=17.64,AAPL=93.85,GOOG=334.08}, 2={MSFT=17.64,AAPL=93.85,GOOG=334.08}

3:{MSFT=17.65,AAPL=93.83,GOOG=334.08} {0={MSFT=17.65,AAPL=93.83,GOOG=334.08},1={MSFT=17.65,AAPL=93.83,GOOG=334.08},2={MSFT=17.65,AAPL=93.83,GOOG=334.08},3={MSFT=17.65,AAPL=93.83,GOOG=334.08}

4:{MSFT=17.64,AAPL=93.83,GOOG=334.07} {0={MSFT=17.64,AAPL=93.83,GOOG=334.07},1={MSFT=17.64,AAPL=93.83,GOOG=334.07},2={MSFT=17.64,AAPL=93.83,GOOG=334.07},3={MSFT=17.64,AAPL=93.83,GOOG=334.07},4={MSFT=17.64,AAPL=93.83,GOOG=334.07}

正如你所看到的,当我打印整个HashMap时,应该有不同的价格序列,它们都是相同的

基本上,.put函数以某种方式覆盖旧条目

如果您知道如何修复该行为,那么HashMap每次都会有一个新的价格序列条目


您需要复制HashMap,否则它看起来就像您只是一次又一次地存储同一个映射,这当然会被覆盖。使用此行:

polledPrice.put(pollNumber, new HashMap(Price.getPricesMap()));

作为最简单的修复方法。

您需要复制HashMap,否则它看起来就像是在一遍又一遍地存储同一个映射,当然会被覆盖。使用此行:

polledPrice.put(pollNumber, new HashMap(Price.getPricesMap()));

作为最简单的修复方法。

您真的需要每秒轮询您拥有的服务吗?对我来说这听起来有点像虐待。您应该在每次轮询之间至少等待5-10秒,尤其是在涉及请求web资源的情况下。我认为尼克给了你一个足够好的答案,但过度投票是邪恶的!不要这样做

你真的需要每秒钟调查一下你有什么服务吗?对我来说这听起来有点像虐待。您应该在每次轮询之间至少等待5-10秒,尤其是在涉及请求web资源的情况下。我认为尼克给了你一个足够好的答案,但过度投票是邪恶的!不要这样做

问题在于Price.getPricesMap每次都返回对同一对象的引用。对我来说,这听起来像是一个糟糕的API设计——或者至少是一个应该被记录的API设计

它可以通过在客户代码中复制或更改价格来修复。后者可以在每次发生实际更改时创建一个不可变映射,也可以在每次调用getPricesMap时返回一个副本。

问题在于Price.getPricesMap每次都返回对同一对象的引用。对我来说,这听起来像是一个糟糕的API设计——或者至少是一个应该被记录的API设计


它可以通过在客户代码中复制或更改价格来修复。后者可以在每次发生实际更改时创建一个不可变的映射,或者在每次调用getPricesMap时返回一个副本。

谢谢Nick,它工作得很好,教给了我一些重要的东西。谢谢Nick,它工作得很好,教给了我一些重要的东西。John,我正在同一个应用程序中轮询一个类价格。Price类只有在通过套接字连接收到新价格时才会更新,因此我不会轮询其他人的服务。我认为这应该没问题?如果它都在同一个应用程序中,而不是轮询,那么当您收到新的价格事件时,为什么不触发快照操作?我们打算让世界上所有交易证券的相当大的子集最终通过此应用程序被解析和过滤。每秒轮询一次,虽然听起来非常频繁,但实际上减少了总的资源需求。不,不管它是否在应用程序中,你真的需要每秒更新吗?这将消耗不必要的系统资源,如果数据自上次以来没有更改,那么每个这样的操作轮询都是冗余的。你如何证明经常进行的必要性调查是合理的?如果你不知道调查的背景,你怎么可能判断1秒是否具有执行力
正在解决的问题或场景?除非你的应用程序是在80年代风格的卡西欧手表中运行,否则1秒很难推动它。约翰,我在同一个应用程序中投票。Price类只有在通过套接字连接收到新价格时才会更新,因此我不会轮询其他人的服务。我认为这应该没问题?如果它都在同一个应用程序中,而不是轮询,那么当您收到新的价格事件时,为什么不触发快照操作?我们打算让世界上所有交易证券的相当大的子集最终通过此应用程序被解析和过滤。每秒轮询一次,虽然听起来非常频繁,但实际上减少了总的资源需求。不,不管它是否在应用程序中,你真的需要每秒更新吗?这将消耗不必要的系统资源,如果数据自上次以来没有更改,那么每个这样的操作轮询都是冗余的。你如何证明经常进行必要性调查是合理的?如果你不知道问题或解决方案的背景,你如何判断1秒是否有效?除非你的应用程序运行在80年代风格的卡西欧手表内,否则1秒很难推动它。。