Java 从HashMap的键中获取HashSet?

Java 从HashMap的键中获取HashSet?,java,hashmap,hashset,Java,Hashmap,Hashset,我有一个相当大的条目(10万条)HashMap。现在,我需要一个HashSet,其中包含此HashMap中的所有键。不幸的是,HashMap只有一个keySet()方法返回一个Set,而不是HashSet 使用Java生成这样一个HashSet的有效方法是什么 HashSet myHashSet = new HashSet(myHashMap.keySet()); 还没有尝试过。您不能从现有的集创建哈希集?但是(更重要的是)为什么您担心从keySet()方法返回给您的实现?Set Set=ne

我有一个相当大的条目(10万条)
HashMap
。现在,我需要一个
HashSet
,其中包含此
HashMap
中的所有键。不幸的是,
HashMap
只有一个
keySet()
方法返回一个
Set
,而不是
HashSet

使用Java生成这样一个
HashSet
的有效方法是什么

HashSet myHashSet = new HashSet(myHashMap.keySet());

还没有尝试过。

您不能从现有的
集创建
哈希集
?但是(更重要的是)为什么您担心从
keySet()
方法返回给您的实现?

Set Set=newhashset(map.keySet())

为什么特别需要哈希集?

任何集合都有相同的接口,因此通常可以互换使用,因为良好实践要求您对所有集合都使用集合接口


如果您确实需要,可以从另一个创建一个。对于通用代码,它可以是:

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());
Map=。。。;
HashSet=newhashset(map.keySet());

假设“高效”一词是您问题的关键部分,并且取决于您想对集合执行什么操作,您可以创建自己的HashSet子类,该子类忽略HashSet实现并在现有映射上显示视图

作为一个部分实现的示例,它可能类似于:

public class MapBackedHashSet extends HashSet
{
    private HashMap theMap;

    public MapBackedHashSet(HashMap theMap)
    {
        this.theMap = theMap;
    }

    @Override
    public boolean contains(Object o) 
    {
        return theMap.containsKey(o);
    }

    /* etc... */
}

如果您不知道该类将如何使用,则需要注意重写所有相关的方法。

为什么需要HashSet而不仅仅是Set?我必须调用的方法需要HashSet,并且相应的代码不是由我编写的。EW。无论是谁写了这个方法,都需要和他好好谈谈。:)+你的评论解释了一切。很高兴您找到了解决方案。:-)@海斯:你应该知道有一个性能的打击。当您从keySet()构造HashSet时,它基本上必须复制整个HashSet。我不确定在100000个元素上执行此操作需要多长时间,但它肯定会消耗大量内存。我知道你没有其他选择,但这可能会给你更多的弹药来请求编写方法的人更改它,因此它需要一个集合而不是哈希集合。(除非他们做了一些非常奇怪的事情,否则他们应该能够只更改参数,其余的将不做任何修改)?如果需要实际的HashSet,
set
应该是HashSet,而不是set。如果
set
可以是
set
,则无需调用HashSet构造函数或存储库,下次我将使用更好的RTFM;)@谢谢你的评论。我稍微澄清了一下我的代码示例,以将其考虑在内。基普:你说得对。实际上,我使用了以下代码:HashSet=newhashset(map.keySet());为什么特别需要哈希集?因为HashSet是可序列化的,而LinkedKeySet不是:),所以它应该是一个SetBackedHashSet来为他工作,使用一个集合作为支持数据。他从
keySet()
获取的原始对象是一个集合,而不是一个HashMap。关键是您不需要以这种方式提取集合。这是为了避免从潜在的大量对象创建新哈希。