编辑:FML!我对哈希码的实现有一个小写的c。 -.-
我一直在努力学习TDD并且一直在关注'通过示例' Kent Beck的书;它非常好!
但是,我似乎无法进步,因为当我访问哈希表时,值返回null。我已经运行了一个调试会话,并且具有该值的对象显然已经存在,结果为null。
构建和访问的代码是:
public void addRate(String from, String to, int rate){
this.rates.put(new Pair(from, to), new Integer(rate));
}
来自和#34; GBP"和" USD"。也通过debug验证。
调用上面的测试用例:
@Test
public void testreduceMoneyDifferentCurrency(){
Bank bank = new Bank();
bank.addRate("GBP", "USD", 2);
Money result = bank.reduce(Money.gbpound(2), "USD");
assertEquals(Money.dollar(1), result);
}
银行中的reduce方法调用方法速率:
public Money reduce(Bank bank, String to){
int rate = bank.rate(this.currency, to);
return new Money(this.amount / rate, to);
}
问题出在哪里:
public int rate(String from, String to){
if (from.equals(to)) return 1;
Integer rate = (Integer) this.rates.get(new Pair(from, to));
return rate.intValue();
}
第一行应对美元 - >美元转换等。
Pair对象是2个用作键的字符串。
我没有使用过很多桌子,但是我无法看清问题是什么,我肯定知道这些值是在散列表中但是' rate'总是返回一个空值。
我看不到树木了。 :)有人能指出我正确的方向吗?
答案 0 :(得分:8)
我认为问题出在Pair
方法中。
当你这样做时:
this.rates.get(new Pair(from, to));
您正在创建Pair
的新实例,该实例与您在addRate
方法中放入地图的实例不同。
如果您希望代码正常运行,您必须使用Pair
类的相同实例,或者在equals
类上正确实现hashCode
和Pair
方法。
以下是对HashMap内部工作的深入了解,以及为使其发挥作用必须采取的措施:https://stackoverflow.com/a/6493946/2266098
答案 1 :(得分:0)
Java保留对象的引用。所以当你想要这样做的时候
this.rates.get(new Pair(from, to));
您基本上是在创建Pair
的新实例,该实例在HashMap
中不作为密钥存在。