【问题标题】:Can I declare a HashMap<key> instead of a HashMap<key,value>?我可以声明 HashMap<key> 而不是 HashMap<key,value> 吗?
【发布时间】:2019-03-08 01:58:52
【问题描述】:

我正在尝试将键插入哈希图中,但我并不真正需要插入值。我可以,但他们不会被使用。我知道哈希图可以接受空键和值,但只能接受一个空键、值对。我可以 map.put(key,null) 将值设为空,但该方法似乎效率低下。我的意图是我将使用map.containsKey(key) 方法来确定哈希图中是否存在键,这就是我不需要值的原因。

话虽如此,有没有办法声明HashMap&lt;key&gt; 而不是HashMap&lt;key,arbitraryValue&gt;,这样我就不必添加不必要的空值了?抱歉,这可能是个愚蠢的问题。

【问题讨论】:

  • 您要查找的数据类型称为Set&lt;E&gt;
  • 如果您不需要键值对,为什么还需要HashMap?为什么不只使用列表或集合?
  • 您应该使用的HashSet 类是使用HashMap 实现的,所以显然它并没有人们想象的那么低效。别担心。
  • 我认为 Google 可能有一个您可能会感兴趣的 HashSet 实现。

标签: java hashmap


【解决方案1】:

正如Jacob G. 所说,您应该使用Set&lt;E&gt;

集合只是一个不包含任何重复项的集合。正如Ole V.V. 所提到的,实现类HashSet&lt;E&gt; 实际上在底层使用HashMap&lt;K,V&gt;,但在您的代码中使用Set&lt;E&gt; 是更好的方法IMO,因为您的问题不需要这些值。

此外,在get(K key) 方法中使用所有值都是nullHashMap&lt;K,V&gt; 存在问题。如果请求的key 没有关联值,此方法将返回null。那么您如何知道您对get 的调用是否返回了有效或无效的null?即

Map<Integer, Object> map = new HashMap<>();

// add entry 0 -> 
map.put(0, null);

Object get1 = map.get(0); // returns null, so 0 must be a key in our map!
Object get2 = map.get(1); // also returns null, so is 1 a key too? No!

所以,对于你的具体问题,我会尝试这样的事情!

Set<MyKey> set = new HashSet<>(); // or any implementing class

...

MyKey someKey = ...

// Check if your key set doesn't have some key, if so add it to the key set
if (!set.contains(someKey)) {
  set.add(someKey);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2012-12-08
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多