哈希表返回null,但存在对象键

tag5nh1u  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(381)

编辑:fml!我的hashcode实现有一个小写的c.--
我一直在努力学习tdd,并一直遵循肯特贝克的“以身作则”的书;非常好!
但是,我似乎没有进展,因为当我访问哈希表时,一个值返回null。我已经运行了一个调试会话,带有该值的对象显然在那里,但是结果是空的。
要构建和访问的代码是:

public void addRate(String from, String to, int rate){
    this.rates.put(new Pair(from, to), new Integer(rate));
}

从和到是“英镑”和“美元”。还通过调试进行了验证。
调用上述内容的测试用例:

@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);
}

bank中的reduce方法调用方法rate:

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对象是两个构造为用作密钥的字符串。
我没有经常使用has表,但我看不出问题是什么,我确定值在hashtable中,但是rate总是返回空值。
我看不见树林也看不见树木有人能给我指一下正确的方向吗?

rta7y2nd

rta7y2nd1#

我认为问题出在 Pair 方法。当您这样做时: this.rates.get(new Pair(from, to)); 您正在创建的新示例 Pair ,这与您在 addRate 方法。
如果希望代码正常工作,则必须使用 Pair 分类或正确实施 equals 以及 hashCode 上的方法 Pair 班级。
下面是对hashmap内部工作的更深入的了解,以及如何使其工作:https://stackoverflow.com/a/6493946/2266098

2vuwiymt

2vuwiymt2#

java保存对象的引用。所以当你想这么做的时候 this.rates.get(new Pair(from, to)); 您基本上是在创建 Pair 在您的 HashMap .

相关问题