【问题标题】:Does "put" overwrite existing values?“放置”会覆盖现有值吗?
【发布时间】:2011-11-04 22:56:38
【问题描述】:

哈希表新手,有一个简单的问题。出于某种原因,谷歌搜索并没有给我一个直接的答案。假设我设置了一个 <int,String> 哈希表:

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

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

【问题讨论】:

  • 如果您想了解特定 Java API 的工作原理,请不要浪费时间“谷歌搜索”。只需转到该类的在线 Javadocs 并阅读该类/方法的文档。
  • 我确实阅读了该文档,但在“返回”行有点不清楚:此哈希表中指定键的前一个值,如果没有,则返回 null。听起来像是返回了旧值。
  • 您在示例中没有使用put 返回的值,所以我看不出javadoc 的那部分与您有什么关系。但是 javadoc 非常清楚......如果有旧值,将返回旧值。

标签: java hashmap hashtable


【解决方案1】:

是的。

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

对于多线程环境,我推荐ConcurrentHashMap 或其他ConcurrentMap 实现。虽然 Hashtable 是同步的,但现在有更复杂的实现可用于并发映射,例如 Guava 的 MapMakerCacheBuilder

还请记住,Map 将具有类型参数 <Integer, String>,因为不支持原始类型参数。

【讨论】:

  • 好的,谢谢。我确实阅读了该文档,但在“退货”行有点不清楚:the previous value of the specified key in this hashtable, or null if it did not have one。听起来好像是返回了旧值……反正回到代码,看看吧。
  • 是的,你得到了旧值。因此,检查 null 是一个很好的方法来查看您是否只是 put 一个新的密钥。
  • 他可以使用 int 作为键,因为 Java 会将其自动装箱为整数。
  • @Paul 明白,但我指的是Map的类型参数
  • 一开始这让我很困惑,因为在我的数据结构课程中,我们花了相当多的时间讨论处理冲突的各种方法,例如下一个可用索引处的项目或将数组放入每个键。我无法想象 Java 的实现会是最简单的解决方案——当发生冲突时,忽略旧值!当然,这是一种非常有用的方法,并使 Hash Maps 成为解决很多问题(或每个问题,如果你相信面试问题的话)的绝佳数据结构。
【解决方案2】:

嗯,只需要添加一行
myHashtable.put(1,"fish");
看看发生了什么惊人的事情

查看此链接:http://docs.oracle.com/javase/6/docs/api/java/util/Hashtable.html#put(K, V)

Returns:
the previous value of the specified key in this hashtable, or null if it did not have one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2022-01-18
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多