Java 当您更新一个集合(它是映射中的一个值),然后将键和值放入映射中时,它是否会创建重复项?

Java 当您更新一个集合(它是映射中的一个值),然后将键和值放入映射中时,它是否会创建重复项?,java,hashmap,set,hashset,Java,Hashmap,Set,Hashset,例如,我有以下代码: public void addDocument(DocumentId documentId, Reader reader) throws IOException { String s = ""; List<String> list; BufferedReader br = new BufferedReader(reader); while((s=br.readLine())!=null)

例如,我有以下代码:

public void addDocument(DocumentId documentId, Reader reader) throws IOException {
        String s = "";
        List<String> list;
        BufferedReader br = new BufferedReader(reader);
        while((s=br.readLine())!=null)
        {
            list = Arrays.asList(s.toLowerCase().split("\\W+"));
            for(int i = 0; i < list.size(); i++)
            {
                if(!map.containsKey(list.get(i)))
                {
                    Set<DocumentId> newset = new HashSet<>();
                    newset.add(documentId);
                    map.put(list.get(i), newset);
                }
                else
                {
                    Set<DocumentId> set = map.get(list.get(i));
                    set.add(documentId);
                    map.put(list.get(i), set);
                }
            }
        }

    }
public void addDocument(DocumentId DocumentId,Reader Reader)引发IOException{
字符串s=“”;
名单;
BufferedReader br=新的BufferedReader(读卡器);
而((s=br.readLine())!=null)
{
list=Arrays.asList(s.toLowerCase().split(\\W+));
对于(int i=0;i
Does
map.put(list.get(i)、set)在地图中创建密钥和值的副本?如果是,我应该在再次添加更新列表之前删除该对吗


另外,映射为
map
map
不允许重复键,将替换
映射中键的旧值,您可以查看API:

将指定值与此映射中的指定键相关联 (可选操作)。如果映射以前包含的映射 键时,旧值将替换为指定的值。(一张地图是m 称为包含密钥k的映射当且仅当m.containsKey(k) 将返回true。)

做map.put(list.get(i),set);是否在地图中创建键和值的副本

不,没有。在Java中,所有内容都是对对象的引用,因此,当您再次将集合放入映射时,实际上是将同一集合作为值,映射到同一个键。不允许使用重复的键(否则结构将不是贴图)

您甚至不需要在映射中再次放置集合,因为一旦获得集合并向其中添加元素,集合将保持映射到映射中的键

您可以使用以下方法获得相同的结果:

public void addDocument(DocumentId DocumentId,Reader Reader)引发IOException{
字符串s=“”;
BufferedReader br=新的BufferedReader(读卡器);
而((s=br.readLine())!=null){
List List=Arrays.asList(s.toLowerCase().split(\\W+));
for(字符串字:列表){
map.computeIfAbsent(word,k->newhashset()).add(documentId);
}
}
}

我将使用此代码段而不是您的条件,因为您不需要重复添加集合。在一个单独的语句中创建集合并填充映射更干净,更易于维护

String key = list.get(i);
if(!map.containsKey(key)) {
    Set<DocumentId> newset = new HashSet<>();
    map.put(key, newset);
} 
map.get(key).add(documentId);
String key=list.get(i);
如果(!map.containsKey(键)){
Set newset=newhashset();
map.put(键、新闻集);
} 
map.get(key).add(documentId);

No,但实际上在这种情况下,修改(添加元素)集合就足够了(第二个put是多余的)。
String key = list.get(i);
if(!map.containsKey(key)) {
    Set<DocumentId> newset = new HashSet<>();
    map.put(key, newset);
} 
map.get(key).add(documentId);