我的申请与股票市场有关。我有一个不断更新一个称为Price的对象的提要。 Price具有存储安全代码(String)和价格(Double)的HashMap。每次有新价格出现时,此对象就会更新。
该应用程序应该扫描价格以获取较大波动。我有一个名为Poller的单独的类,该类每秒轮询Price对象并获取价格快照。快照是如上所述的HashMap。然后,我想将此价格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(大对象)每次都有一个新的价格系列条目。
public class Poller {
private final int period=1000;
private final int delay=1000;
private static int pollNumber=0;
private static HashMap<Integer,HashMap<String,Double>>
polledPrice = new HashMap<Integer, HashMap<String,Double>>();
public void pollPrice(){
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
// System.out.println(Price.getPricesMap());
System.out.println(pollNumber+" : "+Price.getPricesMap());
polledPrice.put(pollNumber, Price.getPricesMap());
System.out.println(polledPrice);
pollNumber = pollNumber+1;
Time atime = new Time();
atime.addToTimeMap(pollNumber);
}
}, delay, period);
}
}
最佳答案
您需要复制HashMap,否则看起来就像您只是一次又一次地存储相同的Map,这当然会被覆盖。使用此行:
polledPrice.put(pollNumber, new HashMap(Price.getPricesMap()));
作为最简单的解决方法。
关于java - 每次我使用.put()时,HashMap都会被覆盖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/576912/