【问题标题】:What is the difference between Set keys() and Set keyset() in Hashtable in Java?Java Hashtable 中的 Set keys() 和 Set keyset() 有什么区别?
【发布时间】:2015-11-17 14:19:09
【问题描述】:

我正在这个网站上学习 Collection Framework:http://way2java.com/collections/hashtable-about/。在阅读了Hashtable 的所有方法后,我看到了两种访问表键的方法:

  1. Set keys():返回一个包含所有键的Set对象

  2. Set keySet():返回一个包含Hashtable的所有键的Set对象。一个相似之处是Hashtable 和Set 不允许重复。在Set 中添加和删除元素也反映在Hashtable

它们都返回一个Set 对象。我看不出他们之间有什么不同。谁能告诉我这个?

【问题讨论】:

  • 不要从那里学习。它看起来已经过时了,特别是如果它正在教你过时的 Hashtable 类。请改用HashMap,它的定义也更好。请注意Hashtable 是Legacy class introduced in Java 1.0 的注释。
  • keys() 不返回Set,而是返回Enumeration<K>。
  • 这个网站的逻辑很好..所以我喜欢它,我学习 Hashtable 因为我想知道 HashMap 和 Hashtable 之间的区别。
  • @Andy Brown:OHHH.. 这个网站犯了错误。
  • @QuanNguyen 随心所欲,但我个人不会阅读任何提供虚假和过时信息的网站。

标签: java collections hashtable


【解决方案1】:

keys() 不返回 Set,而是返回 Enumeration<K>。

Hashtable 是一个非常旧的类,不再推荐使用。它被HashMap 或ConcurrentHashMap † 替换。它在 JCF 出现之前就已经存在,因此在开始时获取键的标准方法是通过 Enumeration - 用于在对象集合中移动的原始 Java 接口。

然后是 Java 1.2 和 JCF。 Hashtable 使用返回 Set 的 keySet() 方法为 Map 接口进行了改造(也与 JCF 一起引入)。出于遗留兼容性原因,保留了 keys 方法。从新方法返回的Set 实现了两件事:

  1. 传达意图 - 它强化了 Hashtable 的键是一个数学集合这一事实
  2. 实现Iterable<T>,替换Enumerable<T>

†来自Hashtable 文档:

从 Java 2 平台 v1.2 开始,该类被改进为实现 Map 接口,使其成为 Java 集合框架的成员。与新的集合实现不同,Hashtable 是同步的。如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。如果需要线程安全的高并发实现,建议使用 ConcurrentHashMap 代替 Hashtable。

【讨论】:

    【解决方案2】:

    Hashtable 是一个旧的、过时的类,在 Java 1.2(!) 中引入 standard collections framework 之前就存在于 Java 中,并且经过改进以遵守 Map 接口。

    keys() 存在于原始的 Hashtable 中,并返回一个 Enumaration 的键。 keySet() 是在 Map 接口中引入的更现代的方法,并返回键的 Set。

    【讨论】:

      【解决方案3】:

      Hashtable中的方法keys()实际上返回的是键的枚举:

        Enumeration<K>    keys()
      

      返回此哈希表中键的枚举。

      【讨论】:

        猜你喜欢
        • 2011-07-05
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 2021-11-25
        • 2016-08-08
        相关资源
        最近更新 更多