簡體   English   中英

為什么用HashMap聲明相似的對象名稱沒有沖突?

[英]Why does declaring similar object name with HashMap has no conflict?

我有個問題。 為什么下面的代碼由於變量沖突而不能用eclipse運行?

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj1 = new PdfPTable(6);

但是如果我將HashMap與循環一起使用,它將起作用:

Map<String, PdfPTable> hash = new HashMap<>();

    for (i = 1; i <= 1; i++){
        hash.put("testObj" + String.valueOf(i), new PdfPTable(6));
        hash.put("testObj" + String.valueOf(i), new PdfPTable(6));
    }

有人可以向我解釋為什么可以運行底層示例嗎? 提前致謝。

在第一種情況下,您將在編譯時使用特定的變量名稱創建變量。 因此,如果在相同范圍內有兩個具有相同名稱的變量,則編譯器將引發錯誤。

在第二種情況下,您實際上是使用字符串作為HashMap的鍵。 在HashMap中使用相同的鍵會導致覆蓋為此鍵存儲的舊值。 即使這樣,這里也與變量名無關。

除了第二個示例,您還可以編寫

Map<String, PdfPTable> hash = new HashMap<>();
hash.put("testObj1", new PdfPTable(6));
hash.put("testObj1", new PdfPTable(6));

這應該表明您實際上PdfPTable用新的第二個實例覆蓋PdfPTable的第一個實例。

這兩個例子無關。 在第一個中,您嘗試在同一范圍內聲明兩個具有相同名稱的變量,這是不允許的。

在第二個例子中,你試圖把兩個相同的鑰匙在一個HashMap ,這將導致在添加只有一個鍵(因為重復鍵是不允許的),第二個put語句將覆蓋原來PdfPTable與第二值PdfPTable值。

這是一個語法問題,您不能有兩個名稱相同的變量。 編譯器不允許這樣做,並說“重復的局部變量”。

看看這個

如果要調用testObj1.ToString();則此代碼將在局部變量中造成歧義testObj1.ToString(); 您實際上會調用什么對象?

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj1 = new PdfPTable(6);

在for循環中,您創建了兩個匿名對象,該對象沒有變量名,因此您讓哈希映射保存對它們的引用,而不是變量。 邏輯上您的兩個示例不匹配,可以簡單地將代碼更改為以下代碼,然后在邏輯上執行相同的操作。

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj2 = new PdfPTable(6);

在第一種情況下,您將創建兩個具有相同名稱的變量並為其分配值。 因此,它在編譯時導致名稱沖突。

在第二種情況下,您只是將值存儲在具有鍵作為字符串的哈希映射中。 在這里,它與變量名無關。 您也可以這樣寫

String testObj1 = "testObj1";
hash.put(testObj1, new PdfPTable(6));
hash.put(testObj1, new PdfPTable(6));

顯然,它與變量聲明或任何命名約定無關。 但是如果以這種方式兩次或多次聲明了testObj1,

String testObj1 = "testObj1";
String testObj1 = "testObj1";

它將再次導致您在編譯時命名沖突。

允許使用相同的鍵將值存儲在哈希圖中,並替換該值。

對於每個未存儲的密鑰,始終分配一個值,並且該值為null。 put()方法始終返回相應鍵的先前值。

假設我們通過這種方式存儲要映射的值,

Map<String, String> hashMap = new HashMap<>();
String previousValue = hashMap.put("key1","value1");
//previousValue would be null.
previousValue = hashMap.put("key1","value2");
//Now previous value would be "value1"
previousValue = hashMap.put("key1","value3");
//Now previous value would be "value2"

因此,很明顯,允許使用相同的鍵存儲值,而這只是將先前的值覆蓋為我們提供的值。

由於局部變量重復,編譯器顯示錯誤。

在第二個中,您只是將密鑰設置為有效的“ testObj”。

暫無
暫無

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

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