[英]Is it a good idea to store data as keys in HashMap with empty/null values?
我最初编写了一个ArrayList
并在其中存储了唯一值(用户名,即Strings
)。 我后来需要使用ArrayList
来搜索用户是否存在。 那是搜索的O(n)
。
我的技术负责人希望我将其更改为HashMap
并将用户名存储为数组中的键,将值存储为空Strings
。
所以,在Java中 -
hashmap.put("johndoe","");
我可以通过运行来查看此用户是否存在 -
hashmap.containsKey("johndoe");
这是O(1)
对吗?
我的主管说这是一种更有效的方法来实现这一点,这对我来说很有意义,但是将hash / empty作为值放在hashmap中并将其中的元素作为键存放似乎有点过时了。
我的问题是,这是一个好方法吗? 效率胜过ArrayList#contains
或一般的数组搜索。 有用。 我担心的是,我没有看到其他人在搜索后这样做。 我可能在某个地方错过了一个明显的问题,但我看不到它。
由于您有一组唯一值,因此Set
是适当的数据结构。 您可以将值放在HashSet
,这是Set
接口的一个实现。
我的主管说这是一种更有效的方法来实现这一点,这对我来说很有意义,但是将hash / empty作为值放在hashmap中并将其中的元素作为键存放似乎有点过时了。
领导的建议是有缺陷的。 Map
不是正确的抽象, Set
是。 Map
适用于键值对。 但是你没有价值观,只有钥匙。
用法示例:
Set<String> users = new HashSet<>(Arrays.asList("Alice", "Bob"));
System.out.println(users.contains("Alice"));
// -> prints true
System.out.println(users.contains("Jack"));
// -> prints false
使用Map
会很尴尬,因为值应该是什么类型? 这个问题在你的用例中毫无意义,因为你只有键,而不是键值对。 使用Set
,您无需询问,使用情况非常自然。
这是O(1)对吗?
是的,在HashMap
或HashSet
搜索是最坏情况下的O(1)摊销,而在List
或数组中搜索是O(n)最坏情况。
一些评论指出HashSet
是根据HashMap
。 这很好, 在那个抽象层面 。 在手头任务的抽象层面---存储一组独特的用户名,使用集合是一种自然的选择,比地图更自然。
这基本上就是HashSet
的实现方式,所以我想你可以说这是一个很好的方法。 您也可以使用HashSet
而不是使用空值的HashMap
。
例如 :
HashSet
的add
实现是
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
其中map
是后备HashMap
和PRESENT
是一个虚拟值。
我担心的是,我没有看到其他人在搜索后这样做。 我可能在某个地方错过了一个明显的问题,但我看不到它。
正如我所提到的,JDK的开发人员正在使用相同的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.