将数据存储为HashMap中具有空值/空值的键是个好主意吗?
我原来写了一个ArrayList并在其中存储了唯一的值(用户名,即Strings )。 我后来需要使用ArrayList来search用户是否存在。 这是O(n)的search。 
 我的技术负责人希望我将其更改为HashMap ,并将用户名作为键存储在数组中,并将值存储为空Strings 。 
所以,在Java中 –
 hashmap.put("johndoe",""); 
我可以看到这个用户以后是否存在运行 –
 hashmap.containsKey("johndoe"); 
 这是O(1)对不对? 
我的领导说这是一个更有效的方式来做到这一点,这对我来说是有道理的,但是在hashmap中存储null / empty作为值并将其作为关键字存储在元素中似乎有点不合适。
 我的问题是,这是一个好方法吗? 通常, ArrayList#contains的效率或数组search。 有用。 我的担心是,我没有看到任何人在search后做这个。 我可能在某个地方错过了一个显而易见的问题,但我看不到它。 
 由于您有一组唯一的值,因此Set是适当的数据结构。 你可以把你的值放在HashSet ,这是Set接口的一个实现。 
我的领导说这是一个更有效的方式来做到这一点,这对我来说是有道理的,但是在hashmap中存储null / empty作为值并将其作为关键字存储在元素中似乎有点不合适。
 领导的build议是有缺陷的。  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会很尴尬,因为应该是什么types的值? 这个问题在你的用例中没有意义,因为你只有键,而不是键 – 值对。 有了Set ,你不需要问,这个用法是完全自然的。 
这是O(1)对不对?
 是的,在HashMap或者HashSetsearch是O(1)最坏情况,而在List或者数组中search最坏的情况是O(n)。 
 有些评论指出HashSet是用HashMap来实现的。 没关系, 在抽象层面 。 在手头任务的抽象层面—存储一组唯一的用户名,使用一组是一个自然的select,比地图更自然。 
 这基本上是如何实现HashSet ,所以我想你可以说这是一个好方法。 你也可以使用HashSet而不是HashMap的空值。 
例如 :
  HashSet的add的实现是 
 public boolean add(E e) { return map.put(e, PRESENT)==null; } 
 其中map是后台HashMap和PRESENT是虚拟值。 
我的担心是,我没有看到任何人在search后做这个。 我可能在某个地方错过了一个显而易见的问题,但我看不到它。
正如我所提到的,JDK的开发人员正在使用相同的方法。