s*********g 发帖数: 2350 | 1 有一个HashMap, 比如
map = new LinkedHashMap(100)
一开始就创建好了, 中途也不会更改。 程序会多线程成千上万次的调用,
每个thread 会iterate map
怎样iterate更快更有效?
1) 用 map.keySet()
2) 用 map.entrySet() 循环
3) initially先把 map.entrySet() copy 成array,多线程时
再循环这个array
我感觉2) 和 3) 差不多, 比1)快。
可是我写了个小程序测了下, 怎么三个都花一样的时间? |
c*m 发帖数: 836 | 2 HashMap根本就没lock, 你得到的entrySet, keySet也不过是个指向mem address的
reference, 所以怎么用区别都不大。 |
z****e 发帖数: 54598 | 3 多线程同时并发修改会导致你在iteration时候丢出concurrentmodificationexception
建议上concurrentHashMap |
s*********g 发帖数: 2350 | 4 那用什么比较好?
【在 c*m 的大作中提到】 : HashMap根本就没lock, 你得到的entrySet, keySet也不过是个指向mem address的 : reference, 所以怎么用区别都不大。
|
s*********g 发帖数: 2350 | 5 如果hashmap不会被修改, 就没事了吧。
concurrentmodificationexception
【在 z****e 的大作中提到】 : 多线程同时并发修改会导致你在iteration时候丢出concurrentmodificationexception : 建议上concurrentHashMap
|
s*********g 发帖数: 2350 | 6 有一个HashMap, 比如
map = new LinkedHashMap(100)
一开始就创建好了, 中途也不会更改。 程序会多线程成千上万次的调用,
每个thread 会iterate map
怎样iterate更快更有效?
1) 用 map.keySet()
2) 用 map.entrySet() 循环
3) initially先把 map.entrySet() copy 成array,多线程时
再循环这个array
我感觉2) 和 3) 差不多, 比1)快。
可是我写了个小程序测了下, 怎么三个都花一样的时间? |
c*m 发帖数: 836 | 7 HashMap根本就没lock, 你得到的entrySet, keySet也不过是个指向mem address的
reference, 所以怎么用区别都不大。 |
z****e 发帖数: 54598 | 8 多线程同时并发修改会导致你在iteration时候丢出concurrentmodificationexception
建议上concurrentHashMap |
s*********g 发帖数: 2350 | 9 那用什么比较好?
【在 c*m 的大作中提到】 : HashMap根本就没lock, 你得到的entrySet, keySet也不过是个指向mem address的 : reference, 所以怎么用区别都不大。
|
s*********g 发帖数: 2350 | 10 如果hashmap不会被修改, 就没事了吧。
concurrentmodificationexception
【在 z****e 的大作中提到】 : 多线程同时并发修改会导致你在iteration时候丢出concurrentmodificationexception : 建议上concurrentHashMap
|
G******n 发帖数: 572 | 11 1或2,直接用2吧是我的话
【在 s*********g 的大作中提到】 : 那用什么比较好?
|
G******n 发帖数: 572 | 12 immutable map?
【在 s*********g 的大作中提到】 : 如果hashmap不会被修改, 就没事了吧。 : : concurrentmodificationexception
|
w**z 发帖数: 8232 | 13 2
【在 s*********g 的大作中提到】 : 那用什么比较好?
|
g*********9 发帖数: 1285 | 14 +1
【在 w**z 的大作中提到】 : 2
|