我在哈希表中保存了一个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+" ");
}
答案 0 :(得分:4)
最有可能的是,您没有覆盖hashCode
课程的equals
和MyDate
方法。散列表依赖于这些方法来确定何时认为两个对象相等。如果你没有覆盖它们,哈希表将比较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
}