簡體   English   中英

調用hashmap.get(object)時在HashMap對象中獲取空值

[英]Getting null value in HashMap object while invoking hashmap.get(object)

我已經實現了用於存儲酒店預訂條目的HashMap。但是我在.get(object)方法上獲取了空值,即使它包含所有鍵並正確返回了鍵。我已經在兩個不同的類中重寫了equals()和hashCode()方法( bookingSeason&entry),因為在其他一些類中也使用了bookingSeason類,它可以正常工作,但在Entry類中則不起作用。

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));
    }

}
roomEntry.put(num,new Entry(newRoom.code));

使用長值num將新的Entry對象輸入到哈希圖中。

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

使用int值i嘗試獲取Entry對象。

但由於

Long.valueOf(11).equals(Integer.valueOf(11)) == false

它將找不到該條目。 您需要將long / Long值傳遞給get方法。 因此,無論使用

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

或使用

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

將解決您的問題。

供參考,請參見為什么Map.get(Object key)不是(完全)泛型的原因

解:

只需更改for循環即可:

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

對此:

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

說明:

您在這里做錯了什么,是您試圖將int傳遞給HashMap<Long, Entry>get方法。

由於HashMaplong用作鍵,因此只要get方法看到您嘗試使用其他類型的不兼容值,例如int ,它只會返回null!

雖然整i ,你傳遞給get具有相同的散列碼作為長num中, get方法將它們視為“不一樣”。

為什么?

想想會發生什么,如果get允許你使用一個對象,它是不相關類型的哈希表的鍵類型的訪問值:

class A {
    @Override
    public int hashCode() { return 1; }
}

class B {
    @Override
    public int hashCode() { return 1; }
}

// in some method
HashMap<A, Object> map = new HashMap<>();
map.put(new A(), "some stuff");
map.get(new B()); // returns "someStuff"! makes no sense, right?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM