- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
map = new HashMap<>(); Set set = ne-6ren">
我得到了这个代码片段:
public static void main(String[] args){
Map<String, Set<String>> map = new HashMap<>();
Set<String> set = new HashSet<>();
set.add("user1");
set.add("user2");
map.put("key1", set);
Map<String, Set<String>> map2 = new HashMap<>();
map2.putAll(map);// I expect all elements are copied
map.get("key1").add("user3");// add 1 element in "map"
System.out.println(map2.get("key1").size()); // "map2" was affected
}
事实上map的set元素的修改影响了map2,所以程序打印的是“3”而不是“2”
这很奇怪,我期望只要我使用“putAll”方法来构建新的map2,我认为键和值都应该被深度克隆?
如何修复我的程序并确保map2完全从map中分离出来,同时复制map中的所有元素?
谢谢
最佳答案
putAll
复制键和值的引用。它不会复制这些引用所引用的实例。
您必须循环(或流式传输)原始 Map
并创建所有值 Set
的副本:
Map<String, Set<String>> map2 =
map.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,e-> new HashSet<>(e.getValue())));
请注意,无需创建 key 的副本,因为 String
是不可变的。
关于java - 为什么java "putAll"无法深复制Map的值元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53279994/
假设我有两个 HashMap : HashMap h1; h1.put("hi", 30); h1.put("hi2",20); h1.put("hi3",10); h1.put("hi4",20)
我正在使用 infinispan 7.2.5 版本来制作内存缓存。为了访问该缓存,我正在使用 Hotrod。所以我有在集群模式下运行的 hotrod 服务器,并且多个客户端可以使用 hotrod 客户
我得到了这个代码片段: public static void main(String[] args){ Map> map = new HashMap<>(); Set set = ne
问题 如果我显式循环遍历 HashMap A 中的每个元素并将每个元素“放入” HashMap B 中,那么我就没有问题。但是,如果由于某种原因尝试调用 A.putAll(B),B 最终会为 null
假设我有两个 HashMap : HashMap h1; h1.put("hi", 30); h1.put("hi2",20); h1.put("hi3",10); h1.put("hi4",20)
在我的代码中, SortedMap subMap; subMap = (db.getDataMap()).tailMap(previousServer)
HashMap map= new HashMap(); System.out.println(map.put(101,"john"));//null System.out.println(map.pu
我对 putAll() method 有疑问用于脚本的谷歌缓存。该方法似乎有效,但仅适用于前(~100)对 在我的脚本中,我必须缓存大量行(~2500 * 3),每一行都有不同的键,我发现缓存服务出现
文档说 ehcache 是线程安全的。据我所知,如果 thread A 更新缓存,这些更新将始终对其他线程可见。 但我想知道 putAll 操作是否是线程安全的和原子的?比如说,我想通过调用 putA
ConcurrentHashMap.putAll(Map) 方法应该是原子的吗? 我在文档中找不到它,ConcurrentMap 接口(interface)中也没有提到它,所以我猜答案是否定的。我要求
当我使用 .putAll() 时,另一个 .putAll() 会覆盖 map 的内容吗?我的 map 会包含 SomeOfMyObjects 和 SomeOfMyObjects 吗? Map blah
我有这个简单的方法,它是我的 CustomBaseAdapter 的一部分 public void setDays(Map sortedDays) { days.clea
有人知道为什么 java 的 BlockingQueue 没有 putAll 方法吗?这样的方法有问题吗?无需完全重新实现 BlockingQueue 即可解决此问题的任何好方法? 最佳答案 for
我有一个将字符映射到整数的 HashMap。为了按值对其进行排序,我编写了比较器并使用 TreeMap。但我缺少值(value)。我检查了字符串“tree”。每个循环之后的 map “字符”看起来像
使用 Guava 的 Multimap 解决泛型问题 class Foo{ ... private Multimap stuff; ... public void ov
我在使用 Map.putAll() 时遇到了一些困难。它不是更新/添加特定记录到我的主 map ,而是覆盖条目: ConcurrentMap> cache = new ConcurrentHash
我想知道在 SparseArray 类的 HashMap 类上是否有与 putAll 方法等效的方法? 我很困惑是否应该使用 append、put 或 setValueAt 以及它是否会给我相同的结果
通常(即不是并发),putAll() 不会比多次调用 put() 更有效,即使假设您排除了构建您传递给 putAll() 的另一个 Map。这是因为 putAll() 将需要迭代传递的 Map 元素,
TreeMap map1 = new TreeMap(); map1.put("A", 1); map1.put("B", 2); map1.put("C", 3); TreeMap map2 = n
我有一个 Hashmap,我在其中编写了一个处理添加和检索值的类。 class ReputationMatrix { private HashMap repMatrix; publi
我是一名优秀的程序员,十分优秀!