Hashtable返回null但存在对象键

nul*_*ull 0 java hashtable

编辑:FML!我对哈希码的实现有一个小写的c.-.-

我一直在努力学习TDD并一直关注Kent Beck的"By Example"一书; 这很好!

但是,我似乎无法进步,因为当我访问哈希表时,值返回null.我已经运行了一个调试会话,并且具有该值的对象显然存在,但结果为null.

构建和访问的代码是:

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

来自和来自"GBP"和"USD".也通过调试验证.

调用上面的测试用例:

@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);
}
Run Code Online (Sandbox Code Playgroud)

银行中的reduce方法调用方法速率:

public Money reduce(Bank bank, String to){
    int rate = bank.rate(this.currency, to);
    return new Money(this.amount / rate, to);
}
Run Code Online (Sandbox Code Playgroud)

问题出在哪里:

    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();
}
Run Code Online (Sandbox Code Playgroud)

第一行应对美元 - >美元转换等.

Pair对象是2个用作密钥的字符串.

我没有使用过很多表但是我看不出问题是什么,我确定这些值在哈希表中但是'rate'总是返回一个空值.

我无法看到树木.:)有人能指出我正确的方向吗?

Nep*_*daj 8

我认为问题在于Pair方法.当你这样做:

this.rates.get(new Pair(from, to));

您正在创建一个新实例Pair,该实例与您在addRate方法中放入地图的实例不同.

如果希望代码正常工作,则必须使用相同的Pair类实例或在类上正确实现equalshashCode方法Pair.

以下是对HashMap内部工作的深入了解以及为使其工作所需做的工作:https://stackoverflow.com/a/6493946/2266098