“放置”会覆盖现有值吗?


74

哈希表的新功能,有一个简单的问题。由于某种原因,谷歌搜索并没有给我一个直接的答案。假设我已经建立了一个<int,String>哈希表:

myHashtable.put(1,"bird");
myHashtable.put(2,"iguana");

我想将“鸟”更改为“鱼”(并保持索引不变)。我可以做一个简单的put,还是需要删除该条目,或者什么?


8
如果您想了解特定Java API的工作原理,请不要浪费时间“搜索”。只需访问该类的在线Javadocs并阅读该类/方法的文档即可。
斯蒂芬·C

1
我确实读过该文档,但是在“返回”行上有点不清楚:此哈希表中指定键的先前值;如果没有,则为null。听起来好像返回了旧值。

您没有使用put示例中返回的值,因此我看不到Javadoc的那一部分与您的关系。但是javadoc非常清晰...如果有一个旧值,则将返回。
斯蒂芬·C

Answers:


87

是。

如果已经存在到指定键的映射,则旧值将被替换(并返回)。请参阅Hashtable.put()

对于多线程环境,建议使用ConcurrentHashMap或其他ConcurrentMap实现。尽管Hashtable已同步,但现在有更多复杂的实现可用于并发映射,例如GuavaMapMakerCacheBuilder

还请记住,由于不支持基本类型参​​数,Map因此将具有类型参数<Integer, String>


好的,谢谢。我确实阅读了该文档,但是在“返回”行上并不清楚:the previous value of the specified key in this hashtable, or null if it did not have one。听起来像是返回了旧值...无论如何回到代码中,都会看看。

是的,您会恢复原来的价值。因此,进行检查null是一种很好的方法put,例如可以查看您是否只是一个新钥匙。
Paul Bellora 2011年

他可以使用anint作为密钥,因为Java会将其自动装箱为Integer。
保罗

@Paul理解了,但是我指的是Map
Paul Bellora

首先,这让我感到非常困惑,因为在我的数据结构课程中,我们投入了大量时间来讨论各种处理冲突的方法,例如,将项放在下一个可用索引处,或者将数组放入每个键中。我无法想到Java的实现将是最简单的解决方案-发生冲突时,请忽略旧值!当然,这是一种非常有用的方法,可以使Hash Maps成为解决许多问题(或每个问题,如果您相信采访问题的人)的出色数据结构
Jeremy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.