我想使用 Java 9 中的新工廠方法創(chuàng)建一個不可變的 hashMapMap.ofEntries()內(nèi)聯(lián),例如:Map<Integer,?String>?map?=?Map.ofEntries(
????Map.entry(1,?"One"),
????Map.entry(2,?"Two"),
????Map.entry(3,?"Three"));然后令我驚訝的是,我發(fā)現(xiàn)我無法以同樣的方式創(chuàng)建不可變的 hashMap!例如,以下代碼將不起作用。HashMap<Integer,?String>?map?=?HashMap.ofEntries(?//not?work
????Map.entry(1,?"One"),
????Map.entry(2,?"Two"),
????Map.entry(3,?"Three"));然后,當(dāng)我想檢查工廠方法返回什么類型的地圖時,我發(fā)現(xiàn)了以下注釋:調(diào)用者不應(yīng)對返回實例的身份做出任何假設(shè)。所以我的問題是,不可變映射的訪問時間復(fù)雜度與 o(1) 的 hashMap 相同嗎?如果不是,如何創(chuàng)建一個既不可變又同時訪問 o(1) 的映射?如果可以內(nèi)聯(lián)創(chuàng)建那就最好了。
1 回答

至尊寶的傳說
TA貢獻1789條經(jīng)驗 獲得超10個贊
可變性或不變性與 中訪問操作的復(fù)雜性沒有直接關(guān)系Map
。例如, aHashMap
將始終用于O(1)
操作get()
,而 aTreeMap
將始終用于O(log n)
。接口的實現(xiàn)類Map
決定了操作的復(fù)雜程度。
此外,始終可以創(chuàng)建不可修改的映射,因為在將Map
項目放入任何具體類型之后,我們可以使任何具體類型不可變,如下所示:
Map<Integer,?String>?immutableMap?=?Collections.unmodifiableMap(mutableMap);
需要明確的是,這是HashMap.ofEntries()
行不通的,因為該ofEntries()
方法是靜態(tài)的并且是在Map
接口中定義的,而不是在其任何實現(xiàn)類中定義的。
而且您不應(yīng)該擔(dān)心無法將映射的類型聲明為HashMap
或其他一些具體類,無論如何,最佳實踐是將映射聲明為接口的類型Map
。
另外,如果您使用的是 Java 9 之前的版本并且不介意使用外部庫,您可以ImmutableMap
從 Guava 使用:
Map<Integer,?String>?immutableMap?=?ImmutableMap.of(key1,?val1,?key2,?val2);
添加回答
舉報
0/150
提交
取消