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

比如数据为 Apple, Orange, Pear,等一堆水果,每一个水果有一个ID,然后每个水果有一堆元数据,用json string表示。

现在要把他们放到ConcurrentHashMap里去
有两种方案

1)放在一层ConcurrentHashMap<String, String>,key为字符串 水果名+ID, 譬如Apple_1323dfutffa342, Orange_dlfjao23231fs12112
2) 分两层,用ConcurrentHashMap<Class<?>, ConcurrentHashMap>表示
第一层,key为诸如 Apple.class, Orange.class
第二层为ConcurrentHashMap<String, String>, key为ID

哪种性能更好,包括多线程同步性能?

跃然一笑
浏览 942回答 5
5回答

拉莫斯之舞

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

守候你守候我

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

摇曳的蔷薇

我通常使用第二种,这样更符合java的设计思想。 至于效率:没太大差别,可以不用考虑。

四季花海

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

相关分类

Java