[英]Correct way to initialize HashMap and can HashMap hold different value types?
所以我在Java中有兩個關於HashMap
的問題:
初始化HashMap
的正確方法是什么? 我認為在我的情況下使用可能是最好的:
HashMap x = new HashMap();
但Eclipse一直建議我使用:
HashMap<something, something> map = new HashMap();
哪個更好?
HashMap
將不同類型的對象/數據類型作為值保存嗎? 例如,這會工作並且沒問題:
map.put("one", 1); map.put("two", {1, 2}); map.put("three", "hello");
在第一個put()
,我想要一個int
作為值,第二個是int[]
,第三個是字符串。 使用HashMap
在Java中可以做到這一點嗎? 此外,有好一家商店HashMap
作為內的值HashMap
?
這取決於您需要何種類型的安全性。 這種非通用的方式最好如下:
Map x = new HashMap();
請注意, x
被鍵入為Map
。 這使得將來更改實現(到TreeMap
或LinkedHashMap
)變得更加容易。
您可以使用泛型來確保某種級別的類型安全:
Map<String, Object> x = new HashMap<String, Object>();
在Java 7及更高版本中,您可以這樣做
Map<String, Object> x = new HashMap<>();
以上雖然更詳細,但避免了編譯器警告。 在這種情況下, HashMap
的內容可以是任何Object
,因此可以是Integer
, int[]
等,這就是你正在做的事情。
如果您仍在使用Java 6, Guava Libraries (雖然它很容易自己做)有一個名為newHashMap()
的方法,它可以避免在執行new
時復制泛型類型信息。 它從變量聲明中推斷出類型(這是Java 7之前的構造函數上不可用的Java特性)。
順便說一下,當你添加一個int或其他原語時,Java就會自動添加它。 這意味着代碼相當於:
x.put("one", Integer.valueOf(1));
你當然可以將HashMap
作為一個值放在另一個HashMap
,但我認為如果你以遞歸方式執行它會有問題(這就是將HashMap
作為一個值本身)。
這是使用Java 1.5進行的更改。 你首先列出的是舊的方式,第二種是新的方式。
通過使用HashMap,您可以執行以下操作:
HashMap<String, Doohickey> ourMap = new HashMap<String, Doohickey>();
....
Doohickey result = ourMap.get("bob");
如果您在地圖上沒有類型,則必須執行以下操作:
Doohickey result = (Doohickey) ourMap.get("bob");
這真的非常有用。 它可以幫助您捕獲錯誤並避免編寫各種額外的強制轉換。 這是我最喜歡的1.5(和更新)功能之一。
您仍然可以在地圖中放置多個內容,只需將其指定為Map,然后您可以將任何對象放入(String,另一個Map和Integer,以及三個MyObjects,如果您願意的話)。
Eclipse建議您聲明HashMap的類型,因為這會強制執行某些類型的安全性。 當然,聽起來你正試圖避免第二部分的類型安全。
如果要執行后者,請嘗試將map聲明為HashMap<String,Object>
。
你寫它的方式相當於
HashMap<Object, Object> map = new HashMap<Object, Object>();
括號內的內容是您將與HashMap中的內容進行通信,以便它可以為您進行錯誤檢查。 如果Object,Object是您實際想要的(可能不是),您應該明確聲明它。 通常,您應該盡可能明確地使用聲明來促進編譯器進行錯誤檢查。 您所描述的內容可能應該像這樣聲明:
HashMap<String, Object> map = new HashMap<String, Object>();
這樣你至少可以聲明你的鍵是字符串,但你的值可以是任何東西。 只要記住在退出值時使用演員表。
第二個是使用Java 1.5引入的泛型。 它將減少代碼中的強制轉換數量,並可幫助您在編譯時而不是運行時捕獲錯誤。 也就是說,這取決於你編碼的是什么。 一個快速而臟的地圖來保存各種類型的對象不需要泛型。 但是如果地圖持有所有從Object以外的類型下降的對象,那么它是值得的。
關於地圖中陣列的先前海報是不正確的。 數組實際上是一個對象,因此它是一個有效值。
Map<String,Object> map = new HashMap<String,Object>();
map.put("one",1); // autoboxed to an object
map.put("two", new int[]{1,2} ); // array of ints is an object
map.put("three","hello"); // string is an object
此外,由於HashMap是一個對象,它也可以是HashMap中的值。
HashMap可以將任何對象保存為值,即使它是另一個HashMap。 Eclipse建議您聲明類型,因為這是集合的推薦做法。 在Java 5下。您可以自由地忽略Eclipse的建議。
在Java 5下,當您將int(或任何基本類型)添加到集合時,它將被自動裝箱到Integer(或其他相應類型)中。 但要小心,因為有一些使用自動裝箱的捕獲。
Eclipse建議您定義generic type
以便您可以具有type safety
。 你可以寫
Map m = new HashMap();
這不能確保類型安全,但以下將確保類型安全
Map<Object,Object> = new HashMap<Object,Object>();
Object
可以是任何類型,如String
, Integer
等。
回答第二個問題:是的,HashMap可以容納不同類型的對象。 這是否是一個好主意取決於你想要解決的問題。
也就是說,你的例子是行不通的。 int值不是Object。 您必須使用Integer包裝類在HashMap中存儲int值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.