我在寻找一些灵感。我的问题是如何池化一个由键-值对标识的对象。我在JVM上工作,不想在运行时创建这些对象时产生垃圾-这就是为什么池化的想法。
因此,让给予一些例子--用户可以提供诸如(A(1) B(4))
、(A(1) B(2) C('foo') E(0))
、(B(4) A(1))
、(A(0))
等标识符。--对于这些对集合中的每一个,我希望获得对先前创建的对象的唯一引用。注意,(A(1) B(4))
和(B(4) A(1))
应该指向完全相同的引用--当然,我可以按键排序,然后执行计算。
当然,我可以在运行时创建一个map作为键,并保留一个Map<Map<K,V>, T>
,但当我们讨论每秒X千次查找时,这并不是真正有效。
我想对这些输入对进行哈希运算,得到唯一的id --但我必须证明,当k-v的数量或种类在运行时增加时,哈希函数不会发生冲突。我希望唯一的k-v对不超过1 M,所以计算id将是最好的解决方案,并将该idMap到对象--但我需要计算这样的id的函数。
也许一些聪明的图形结构可以是一个解决方案,我唯一的麻烦是,不仅键创建了一个图形,而且这些键的值也创建了一个图形。
任何帮助都将不胜感激。
1条答案
按热度按时间w80xi6nr1#
我已经解决了这个特殊问题,每个线程都有一个Key Builder示例,Key Builder保存一个对象数组--这个数组的大小是已知的,因为我们有严格定义的键(在示例中是A、B、C等--所以我们知道该键的序数)。
我没有为每个请求执行分配任何东西,我们重用构建器来设置数组中的键值,一旦完成,我就可以使用键来查找或创建由那些K-V标识的对象。这种方法还解决了顺序问题,因为它不影响某人是否通过
(A(1) B(4))
或(B(4) A(1))
标识对象-遵循示例。我可以使用Map而不是Objects[],但至少java.util.HashMap的实现分配了大量的节点对象,并且我将为每个请求清除这样的Map!如果您使用缓存节点的Map-那么这可能是一种方法。