40
|
Randy Sugianto 'Yuku' · 技术社区 · 15 年前 |
![]() |
1
18
事实上,这不仅仅是
你的主要问题是
我认为代码维护是一个很大的激励因素。防止重复和膨胀也是如此。
明确地:
从
如果你能实现你的
如果您选择实现
也就是说,没有什么能阻止你实现
|
![]() |
2
4
我猜想,对于实际的应用程序或重要的基准测试,它从来没有出现过重大问题。为什么为了没有真正的好处而把代码复杂化?
另外请注意,在许多JVM实现中,对象大小是四舍五入的,因此实际上可能不会增加大小(我不知道这个例子)。以及
|
![]() |
3
4
我的猜测是,哈希集最初是根据哈希图实现的,目的是为了快速、轻松地完成它。就代码行而言,hashset是hashmap的一部分。 我想它还没有被优化的原因是害怕改变。 然而,浪费比你想象的要严重得多。在32位和64位上,hashset比需要的大4倍,hashmap比需要的大2倍。哈希映射可以用一个数组实现,数组中包含键和值(加上冲突链)。这意味着每个条目有两个指针,或者64位虚拟机上有16个字节。事实上,hashmap每个条目包含一个条目对象,它为指向条目的指针添加了8个字节,为条目对象头添加了8个字节。哈希集也使用每个元素32个字节,但是浪费是4x而不是2x,因为它只需要每个元素8个字节。 |
![]() |
4
3
是的,你是对的,在那里有少量的浪费。很小,因为每个条目都使用相同的对象
大多数情况下,我认为他们采用这种方法来实现可维护性和可重用性。(JCF开发人员会想,我们已经测试了hashmap,为什么不重用它呢。) 但是如果你有大量的收藏,而且你是一个记忆怪胎,那么你可以选择放弃更好的选择,比如 Trove 或 Google Collections . |
![]() |
5
3
我看了你的问题,想了想你说了些什么。这是我对
需要让虚拟实例知道该值是否存在于集合中。 看看add方法
现在让我们来看看看跌回报值
所以
也就是说,你可以争辩说他们可以使用这样的实现
我想他们浪费了4个字节来避免计算哈希代码,因为这可能会花费两次(如果要添加密钥的话)。
如果你问他们为什么用
|
![]() |
6
0
在搜索了类似这样的页面后,想知道为什么标准实现的效率会比较低,找到了com.carrotsearch.hpc.intopenhashset。 |
![]() |
7
-3
你的问题: 我认为这会浪费4字节(在32位机器上)的条目本身的大小。 只为哈希集的整个数据结构创建一个对象变量,这样做可以避免重新编写整个哈希映射类型的代码。
所有键都有一个值,即present对象。 |