在调用hashmap.get(object)时在HashMap对象中获取null值

时间:2016-10-01 03:30:51

标签: java null hashmap

我已经实现了HashMap来存储酒店预订条目。但是我在.get(object)方法上得到空值,即使它包含所有键并正确返回键。我已经覆盖了equals()& hashCode()方法在两个不同的类(bookingSeason& entry)中,因为bookingSeason类也在其他类中使用,它可以正常工作但在入门类中它不起作用。

public class Entry {
String code;
List<BookingSeason> booking=new ArrayList<>();  

public Entry(String code) {
    this.code=code;
}

 @Override
public boolean equals(Object o) {

    if(o==null)
        return false;
    if(!(o instanceof Entry))
        return false;
    Entry room=(Entry) o;
    return this.code.equals(room.code)&&
            this.booking.equals(room.booking);
}

@Override
public int hashCode() {
   return Objects.hash(code,booking);
}
}
public class BookingSeason {
LocalDate startDate;
LocalDate endDate;
public BookingSeason(LocalDate startDate,LocalDate endDate) {
    this.startDate=startDate;
    this.endDate=endDate;
}

@Override
public boolean equals(Object object)
{
    if(object==this)
        return true;
    if(!(object instanceof BookingSeason))
        return false;
    BookingSeason bS=(BookingSeason) object;
    return Objects.equals(startDate,bS.startDate)&& Objects.equals(
            endDate,bS.endDate);
}

@Override
public int hashCode() {
    return Objects.hash(startDate,endDate);
}
}
public class Hotel {
List<BookingSeason> bookPeriod=new ArrayList<>();
HashMap<Long,Entry> roomEntry =new HashMap<>();
long num;
Entry newRoom=new Entry();
for(int i=101;i<=199;i++) {
        num=i;
        newRoom.code="A";
        newRoom.code=newRoom.code.concat(String.valueOf(i));
        roomEntry.put(num,new Entry(newRoom.code));
        System.out.println(roomEntry.get(i));
    }

}

2 个答案:

答案 0 :(得分:2)

num

使用长值Entry将新的System.out.println(roomEntry.get(i)); 对象输入到hashmap中。

i

使用int值Entry来尝试获取Long.valueOf(11).equals(Integer.valueOf(11)) == false 对象。

但是,因为

 System.out.println(roomEntry.get(num));

它不会找到该条目。您需要将long / Long值传递给get方法。因此,使用

System.out.println(roomEntry.get((long) i));

或使用

{{1}}

将解决您的问题。

有关参考,请参阅What are the reasons why Map.get(Object key) is not (fully) generic

答案 1 :(得分:0)

解决方案:

只需更改for循环:

for(int i=101;i<=199;i++) {

到此:

for(long i=101;i<=199;i++) {

说明:

您在这里做错了的是,您试图将int传递给get的{​​{1}}方法。

由于HashMap<Long, Entry>使用HashMap作为键,因此只要long方法看到您尝试使用其他类型的不兼容值(例如get),它就会返回空!

虽然传入int的整数i与长get具有相同的哈希码,但num方法将它们视为“不相同”。< / p>

为什么?

考虑如果get允许您使用与哈希映射的键类型无关的类型的对象来访问值,会发生什么:

get