为了账号安全,请及时绑定邮箱和手机立即绑定

大堆数据放在ConcurrentHashMap里去,是分层放,还是放一层,哪个性能更好?

大堆数据放在ConcurrentHashMap里去,是分层放,还是放一层,哪个性能更好?

跃然一笑 2019-03-01 10:37:51
比如数据为 Apple, Orange, Pear,等一堆水果,每一个水果有一个ID,然后每个水果有一堆元数据,用json string表示。 现在要把他们放到ConcurrentHashMap里去有两种方案 1)放在一层ConcurrentHashMap<String, String>,key为字符串 水果名+ID, 譬如Apple_1323dfutffa342, Orange_dlfjao23231fs121122) 分两层,用ConcurrentHashMap<Class<?>, ConcurrentHashMap>表示第一层,key为诸如 Apple.class, Orange.class第二层为ConcurrentHashMap<String, String>, key为ID 哪种性能更好,包括多线程同步性能?
查看完整描述

5 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

第一种,业务没有需求,你写第二种完全是瞎胡闹,Map的get 和 put 操作性能都是常熟级的,俩个map就是俩次get俩次put,而且增加了业务复杂度

查看完整回答
反对 回复 2019-03-01
?
守候你守候我

TA贡献1802条经验 获得超10个赞

如果id是UUID/GUID,就没有必要用两层Map,因为不会有Hash Collision;如果id在不同类型之间有重复的,你就必须用两层Map。所以用一层或两层Map并不在于性能,通常你也不需要考虑性能,Map的操作是很快,及时数据量很多。如果你因为担忧Hash Collision(通常这种情况很少发生),你需要根据具体的数据结构,调整它的Hash算法或想其它的方法,多层的Map不是解决Hash Collision的一个有效的方案。另外,如果没有什么原因,最好用HashMap,而不是ConcurrentHashMap

查看完整回答
反对 回复 2019-03-01
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我通常使用第二种,这样更符合java的设计思想。

至于效率:没太大差别,可以不用考虑。

查看完整回答
反对 回复 2019-03-01
?
四季花海

TA贡献1811条经验 获得超5个赞

你这个问题基本上是无法回答的。因为没有更加确切的信息和使用场景。
比如:总的数据量有多少,数据是初始化时一次加载的还是随时更新的,如果更新的话更新频率是多少,数据的访问频率是多少,是多个线程同时访问/更新,还是单线程访问/更新。更新和访问场景,是每次局部化在某种特定水果类别里访问不同id,还是和类别关系不大?
性能更好指的是加载性能,访问性能还是修改更新性能?
为什么性能更好这个问题这么重要?多快算性能好呢?你有没有做过基准测试来量化不同的性能对系统的影响。并且明确你想达到的目标呢?

查看完整回答
反对 回复 2019-03-01
  • 5 回答
  • 0 关注
  • 941 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号