我已经实现了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));
}
}
答案 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