簡體   English   中英

正確的方法來初始化HashMap並且HashMap可以保存不同的值類型嗎?

[英]Correct way to initialize HashMap and can HashMap hold different value types?

所以我在Java中有兩個關於HashMap的問題:

  1. 初始化HashMap的正確方法是什么? 我認為在我的情況下使用可能是最好的:

     HashMap x = new HashMap(); 

    但Eclipse一直建議我使用:

     HashMap<something, something> map = new HashMap(); 

    哪個更好?

  2. 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 這使得將來更改實現(到TreeMapLinkedHashMap )變得更加容易。

您可以使用泛型來確保某種級別的類型安全:

Map<String, Object> x = new HashMap<String, Object>();

在Java 7及更高版本中,您可以這樣做

Map<String, Object> x = new HashMap<>();

以上雖然更詳細,但避免了編譯器警告。 在這種情況下, HashMap的內容可以是任何Object ,因此可以是Integerint[]等,這就是你正在做的事情。

如果您仍在使用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可以是任何類型,如StringInteger等。

回答第二個問題:是的,HashMap可以容納不同類型的對象。 這是否是一個好主意取決於你想要解決的問題。

也就是說,你的例子是行不通的。 int值不是Object。 您必須使用Integer包裝類在HashMap中存儲int值

暫無
暫無

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

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