Java中哈希表手动解决冲突的方法说明

4
我的任务是做一个银行管理系统。客户账户使用哈希表存储在银行内,因此对于每个客户,由个人身份证号表示,将有一个帐户数组列表(一个客户最多可以拥有两个帐户-储蓄帐户和支出帐户)。
我需要手动处理可能发生的冲突。我该怎么做?我需要覆盖哪种方法?我必须提到,哈希表不是我的强项,因为我在C中使用它们时遇到了困难。
附:我计划使用HashMap,因为我理解它更容易使用。
编辑-手动冲突处理是要求。
编辑2-这是要求,因为实验助理希望我们了解哈希表的工作原理。经过更深入的挖掘,我想我需要覆盖Hashtable的“equals”方法,因此不需要HashMap。这是正确的方法吗?(不需要新的ADT)

请解释为什么这是一个要求。在Java中,您是否需要实现自己的哈希表? - Stephen C
如果你需要处理碰撞,那么你需要构建自己的数据结构(你不能使用 HashMap,因为它只是工作)。 - Greg Kopff
2个回答

3

标准哈希表实现可以自动处理碰撞,您无法对此进行控制。但是,您必须为用作键的对象实现hashCode()equals() - 但在String / Number的情况下,标准库已经完成了这些工作。

因此,如果任务确实需要您处理碰撞 - 那么您必须构建自己的Map实现。


2
我需要手动处理可能发生的冲突。我该怎么做?
如果硬性要求您自己处理碰撞,那么您需要从头开始实现哈希表。我不知道任何现有的类可以使用,因为它们都会为您处理碰撞等问题,例如HashMap或HashTable。
我必须提到哈希表不是我的强项,因为我在C中使用它们时遇到了困难。
很不幸,您将不得不理解它们才能完成这个练习。(二话不说,也许这个要求是一件好事……如果它迫使您正确地理解哈希表的工作方式。)
值得一提的是,有许多关于数据结构的良好教材,它们解释了哈希表的工作原理。如果您没有教科书,Wikipedia页面非常全面。教科书和维基百科都会描述处理碰撞的各种技术。
经过更深入的研究,我认为我需要重写Hashtable中的“equals”方法,因此不需要使用HashMap。这是正确的方法吗?(不需要新的ADT)
我认为不是这样。
- Hashtable / HashMap的“equals”方法与哈希表条目的冲突处理无关。 - Hashtable / HashMap中的冲突检测逻辑在私有方法中,因此您不能直接覆盖它。 - 我认为实验助手希望/期望您实现哈希表ADT,并且我不知道您如何避免这样做。但是,嘿,您始终可以询问实验助手他或她希望您做什么。
额外建议:地图的目标类型应该是一个自定义类,它包含了对于两个账户的引用,同时也包含用户的个人信息。它不应该是一个ArrayList

手动处理碰撞是必需的。我如何使用HashMap来实现? - Mihai Andrei Rustiuc
1
@MihaiAndreiRustiuc HashMap的碰撞处理是自动的,它不会暴露出手动碰撞处理的方法。 - josefx
助教发布了这个要求,以便我们更好地理解哈希表和冲突。 - Mihai Andrei Rustiuc
@josefx 好的,那我应该使用什么来手动处理碰撞呢? - Mihai Andrei Rustiuc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接