从哈希表获取值返回null

时间:2014-05-28 14:57:18

标签: java hashtable actionlistener

我在哈希表中保存了一个String值, 但是当我试图得到它时,我总是得到它 谁能明白为什么?

这是动作监听器的代码:

private class ButtonListener implements ActionListener{


    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==btnSave){
            int day = Integer.parseInt((String)daysBox.getSelectedItem());
            int month = Integer.parseInt((String)monthsBox.getSelectedItem());
            int year = Integer.parseInt((String)yearsBox.getSelectedItem());
            MyDate date = new MyDate(day, month, year);
            System.out.println(date);
            diary.put(date,textArea.getText());
            textArea.setText(null);
        }
        if (e.getSource()==btnShow){
            int day = Integer.parseInt((String)daysBox.getSelectedItem());
            int month = Integer.parseInt((String)monthsBox.getSelectedItem());
            int year = Integer.parseInt((String)yearsBox.getSelectedItem());
            MyDate date = new MyDate(day, month, year);
            String s = diary.get(date);
            textArea.setText(s+" ");
        }

1 个答案:

答案 0 :(得分:4)

最有可能的是,您没有覆盖hashCode课程的equalsMyDate方法。散列表依赖于这些方法来确定何时认为两个对象相等。如果你没有覆盖它们,哈希表将比较MyDate对象,看它们是否是相同的实例,它们永远不会出现在你的代码中,因为每次执行get / put时都会创建new个实例调用

在MyDate课程中,您需要以下内容:

@Override
public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof MyDate)) return false;
    MyDate d = (MyDate)o;
    return this.day == d.day && this.month == d.month && this.year == d.year;
}

@Override
public int hashCode() {
    return ((day * 31) + month) * 31 + year; // 31=prime number
}