- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常(即不是并发),putAll()
不会比多次调用 put()
更有效,即使假设您排除了构建您传递给 putAll()
的另一个 Map。这是因为 putAll()
将需要迭代传递的 Map 元素,并运行用于将每个键值对添加到 put()
执行的 Map 的算法。
但是对于一个 ConcurrentHashMap 来说,构造一个常规的 Map 然后使用 putAll()
更新它有意义吗?或者我应该对 put()
进行 10 次(或 100 次或 1000 次)调用?
多次调用 putIfAbsent()
的答案是否改变?
谢谢!
最佳答案
Java Collections 中的第一个(主要是)线程安全 Map 是同步的 HashMap
使用 Collections.synchronizedMap()
.它的工作原理是一次只允许一个操作。 Java 5 添加了 ConcurrentHashMap
, 它的工作方式不同。基本上是 Map
被分成片。 put()
操作只会锁定相关的切片。它还添加了线程安全原语,如 putIfAbsent()
.
我解释这个的原因是 putAll()
可能或多或少取决于它的实现方式。它可能通过锁定整个 map 来工作,这实际上可能比尝试在每个 put()
上获得单独的锁更有效。 .或者它可以通过做一堆 put()
来工作无论如何调用,在这种情况下没有太大区别。
因此,如果它对您的代码有意义并且您同时进行大量更新,我会使用 putAll()
除非它是 putIfAbsent()
就是你想要的。
编辑: 我刚刚检查过,Java 6 ConcurrentHashMap
工具 putAll()
作为 put()
的循环操作,所以这并不比自己做更好或更糟。
关于java - ConcurrentHashMap 和 putAll() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677916/
假设我有两个 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
我是一名优秀的程序员,十分优秀!