2016-10-04 74 views
1

介紹

我們想在Map進行搜索,如果它包含一個特定singer值添加元素到ArrayList的一個HashMap中。如果是這樣,那麼我們將在屬於singer的​​中添加disk。如果singer不存在,則我們將singer添加到Map,其中空的ArrayList通過返回ArrayList和分配給它

地圖的結構如下:

Map<Singer,List<Disk>> diskMap = new HashMap<Singer, List<Disk>>(); 

SingerList<Disk>類型。

代碼工作正常。當我們使用discography.add(disk);添加磁盤

discography = diskMap.get(singer); 
discography.add(disk); 
  • :我不明白的代碼的最後一部分。它會在地圖上更新嗎?
  • 是否與diskMap.get(singer).add(disk)類似?
  • 如果更新正確?它如何在內存中工作?

源代碼

public void addDisk(Disk disk){ 
    Singer singer = disk.getSinger(); 
    List<Disk> discography = null; 
    if(diskMap.get(singer) == null){ 
     diskMap.put(singer, new ArrayList<Disk>()); 
    } 

    discography = diskMap.get(singer); 
    discography.add(disk); 
    } 
+0

你在使用Java 8嗎?如果是這樣,'diskMap.computeIfAbsent(singer,x - > new ArrayList <>())'解決了這一行。 –

+1

1)它會更新你的地圖值2)diskMap.get(singer).add(disk)和discography.add(disk);都是一樣的 –

回答

7

當我們使用discography.add(磁盤);添加磁盤。它會在地圖上更新嗎? =>是的。

是否與diskMap.get(singer).add(disk)類似? =>是的。

如果更新正確?它如何在內存中工作?

discography = diskMap.get(singer);

這將discography var分配給與地圖條目相同的對象(相同列表)。

兩者都指向相同的內存對象(相同的引用)。如果添加或刪除元素到唱片集,它也會影響地圖中的列表

+0

是的,我檢查地圖中列表的大小,它正在增加。十分有趣。我迷失了指針。 –

1

當我們使用discography.add(disk);添加磁盤。它會在地圖上更新嗎?

將給定關鍵點的值映射到列表。調用map.get不會複製給定密鑰的值。

是否與diskMap.get(singer).add(disk)類似?

是的。

如果更新正確?它如何在內存中工作?

是的。在內存中:

  • map.get給定鍵的查找和返回列表。如果沒有數值,則返回null。內部HashMap使用EntrySet來存儲名爲Map.Entry的鍵值對。
  • list.add添加元素列表。 Java列表是可變的,所以不會有任何複製。
+0

得到返回一個引用呢?那是對的嗎? –

+1

是的。在Java中,我們只使用對象類型的引用。對於我們使用值的基元。 –

+0

看看這個話題。有很多信息可以讓你喜歡:http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – BenB