2016-10-04 33 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