修改映射的键集可以吗,还是滥用了Java中行为未定义的映射?

修改映射的键集可以吗,还是滥用了Java中行为未定义的映射?,java,dictionary,set,Java,Dictionary,Set,我注意到我们可以在Java中操作映射中的键集 例如,这里我们复制一个映射,然后通过调用set:retainal修改键集,有效地删除一些条目 MapdailyAssignment=newenummap(DayOfWeek.class); dailyAssignment.put(DayOfWeek.MONDAY,“Alice”); dailyAssignment.put(DayOfWeek.周二,“Bob”); dailyAssignment.put(DayOfWeek.SATURDAY,“Bob”

我注意到我们可以在Java中操作映射中的键集

例如,这里我们复制一个映射,然后通过调用
set:retainal
修改键集,有效地删除一些条目

MapdailyAssignment=newenummap(DayOfWeek.class);
dailyAssignment.put(DayOfWeek.MONDAY,“Alice”);
dailyAssignment.put(DayOfWeek.周二,“Bob”);
dailyAssignment.put(DayOfWeek.SATURDAY,“Bob”);
dailyAssignment.put(DayOfWeek.SUNDAY,“Carol”);
Listweekend=List.of(DayOfWeek.周六,DayOfWeek.周日);
MapweekendAssignment=newenummap(dailyAssignment);
weekendAssignment.keySet().Retainal(周末);
转储到控制台

System.out.println(“dailyAssignment.toString():”+dailyAssignment);
System.out.println(“weekendAssignment.toString():”+weekendAssignment);
这似乎是可行的,如Java12所示

dailyAssignment.toString():{MONDAY=Alice,周二=Bob,周六=Bob,周日=Carol}

weekendAssignment.toString():{SATURDAY=Bob,SUNDAY=Carol}


➥ 虽然这似乎有效,但这是否正确使用了地图中的键集?Javadoc for方法不处理返回的密钥集的可变性。

是的,在
映射中对
密钥集
进行变异是受支持的功能

查看的是Javadoc,而不是它的实现。文档中特别指出,改变一组键是改变地图的一种可接受的方式

引用Javadoc:…集合支持元素删除

返回此映射中包含的键的视图。集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改映射(通过迭代器自己的移除操作除外),则迭代的结果是未定义的。集合支持元素移除,即通过
迭代器。移除
集合。移除
移除所有
保留
清除
操作从映射中移除相应的映射。它不支持添加或添加所有操作


亲爱的投票人,请在投票的同时留下批评意见。加油。如果您对实现选择有任何疑问,请编写大量的单元测试,以使您确信它是有效的。