求助关于Java中hashtable类的问题

马小李 2014-10-22 10:42:21
Java中的hashtable类在API中的描述如下:
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。

为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

Hashtable 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。
为了确认不是翻译问题,其英文版如下:
This class implements a hash table, which maps keys to values. Any non-null object can be used as a key or as a value.

To successfully store and retrieve objects from a hashtable, the objects used as keys must implement the hashCode method and the equals method.

An instance of Hashtable has two parameters that affect its performance: initial capacity and load factor. The capacity is the number of buckets in the hash table, and the initial capacity is simply the capacity at the time the hash table is created. Note that the hash table is open: in the case of a "hash collision", a single bucket stores multiple entries, which must be searched sequentially. The load factor is a measure of how full the hash table is allowed to get before its capacity is automatically increased. The initial capacity and load factor parameters are merely hints to the implementation. The exact details as to when and whether the rehash method is invoked are implementation-dependent.
其解决冲突的方式的开散列,也就是一个关键值下可以放置多个值,可是:
V put(K key, V value)
将指定 key 映射到此哈希表中的指定 value。
其put函数是用覆盖的方式存放数值,这是为什么呢?有高手给解释下吧
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
马小李 2014-10-22
  • 打赏
  • 举报
回复
引用 4 楼 whos2002110 的回复:
[quote=引用 2 楼 mxlmhgzw 的回复:] [quote=引用 1 楼 whos2002110 的回复:] 覆盖是key的hashCode 经过散列到对应下标时,且在这个链表中存在oldkey与之equals 才会在oldKey的那个Entity中覆盖value。 没有与之equals的oldKey时,采用头插法保存最新的key-value pair
我大概懂了 是不是这个开散列的方式并不是我所想的以key的内容在数组中搜索,而是以key的hashcode的内容在数组中搜索,然后不同的key可能有相同的hashcode这样会导致冲突才会在下面建立链表以供线性搜索,而对于key相同的不同value只存储最新的条目 是不是呢? 希望帮忙详细解答下,真心感谢了[/quote] 对的,最好自己对着源代码一点点看, Map里面put方法还是比较简单的。 再可以debug,看它里面维护的Entry[] tables;值是怎么存的。[/quote] 嗯 谢谢指导了 我刚看源码看得不是很懂 这下懂了,完全没想到不同的key有相同的hashcode,这样散列的效果有点低啊 再次感谢指点 谢谢
马小李 2014-10-22
  • 打赏
  • 举报
回复
引用 3 楼 loneking2001 的回复:
一个 key 不会放多个 value,应该是一个 hash 可能放多个 key-value。这时虽然 hash 值碰撞了,但 key 还是不一样的。
嗯 其实我就没弄明白 或者叫没想到 竟然不同的key可能有相同的hash值 这真是惊呆了
whos2002110 2014-10-22
  • 打赏
  • 举报
回复
引用 2 楼 mxlmhgzw 的回复:
[quote=引用 1 楼 whos2002110 的回复:] 覆盖是key的hashCode 经过散列到对应下标时,且在这个链表中存在oldkey与之equals 才会在oldKey的那个Entity中覆盖value。 没有与之equals的oldKey时,采用头插法保存最新的key-value pair
我大概懂了 是不是这个开散列的方式并不是我所想的以key的内容在数组中搜索,而是以key的hashcode的内容在数组中搜索,然后不同的key可能有相同的hashcode这样会导致冲突才会在下面建立链表以供线性搜索,而对于key相同的不同value只存储最新的条目 是不是呢? 希望帮忙详细解答下,真心感谢了[/quote] 对的,最好自己对着源代码一点点看, Map里面put方法还是比较简单的。 再可以debug,看它里面维护的Entry[] tables;值是怎么存的。
rayw0ng 2014-10-22
  • 打赏
  • 举报
回复
一个 key 不会放多个 value,应该是一个 hash 可能放多个 key-value。这时虽然 hash 值碰撞了,但 key 还是不一样的。
马小李 2014-10-22
  • 打赏
  • 举报
回复
引用 1 楼 whos2002110 的回复:
覆盖是key的hashCode 经过散列到对应下标时,且在这个链表中存在oldkey与之equals 才会在oldKey的那个Entity中覆盖value。 没有与之equals的oldKey时,采用头插法保存最新的key-value pair
我大概懂了 是不是这个开散列的方式并不是我所想的以key的内容在数组中搜索,而是以key的hashcode的内容在数组中搜索,然后不同的key可能有相同的hashcode这样会导致冲突才会在下面建立链表以供线性搜索,而对于key相同的不同value只存储最新的条目 是不是呢? 希望帮忙详细解答下,真心感谢了
whos2002110 2014-10-22
  • 打赏
  • 举报
回复
覆盖是key的hashCode 经过散列到对应下标时,且在这个链表中存在oldkey与之equals 才会在oldKey的那个Entity中覆盖value。 没有与之equals的oldKey时,采用头插法保存最新的key-value pair

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧