![](/img/trans.png)
[英]Java Map with container object keys, lookup by container object field value?
[英]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.