簡體   English   中英

為什么Java的Map接口有一個containsValue(Object)方法,但是沒有value-> keys查找?

[英]Why does Java's Map interface have a containsValue(Object) method, but no value->keys lookup?

這里有一些問題,如何獲得與給定值相關聯的Map s鍵,答案指向google集合(用於雙向映射)或基本上說“循環它”。

我剛剛注意到Map接口有一個boolean containsValue(Object value)方法,“對於Map接口的大多數實現,它可能需要時間線性的地圖大小”,而AbstractMap的實現確實迭代了entrySet()

設計決定在Map包含containsValue但沒有Collection<V> getKeysForValue(Object)什么? 我可以看出為什么人們會省略兩者,或者包括兩者,但如果有的話,為什么不能另外呢?

我想到的一件事是,它需要任何Map實現來了解返回值的Collection實現,但這實際上並不是一個好理由,因為Collection<V> values()方法也返回一個集合(在AbstractMap情況下匿名new AbstractCollection<V>() )。

有一些集合支持這一點,但它們通常涉及主題化反向查找映射,這比相對簡單的一對一映射更昂貴。 因此,支持這一點可能會使所有地圖的更新成本增加兩倍。

另一個問題是概括。 密鑰必須實現hashCode和equals(對於Hash映射)或可比較(對於Sorted Maps)值不必實現任何使得構造廣義反向查找不可能的任何東西,或者它對不太可能需要的值提出額外要求。

從1.2開始,Maps可以返回其鍵和值的Collection ,因此查找值非常簡單: public Object containsValue(Object v) {return values().contains(v);}此方法使用values()本機優化values()並且contains()用於Map任何實現,但在大多數情況下可能都很慢......

你正在尋找的getKeysForValue(Object)並不簡單。 它需要一個特定的算法,並且這個算法不能足夠通用,它必須針對Map每個實現進行優化。

這可能是原因,或者僅僅是Collection API充滿了這種小漏洞......

暫無
暫無

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

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