首先, 我们来看,Javadoc对这三者的描述,
HashMap, Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key.
Hashtable, This class implements a hash table, which maps keys to values. Any non-null object can be used as a key or as a value.
HashSet, This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.
首先呢, 大家应该清楚Map和Set这两个接口直接是没有任何联系的, 一个是键值对的关系, 一个是集合。
HashMap 和Hashtable的区别
Hashtable, 大家有没有发现他不符合驼峰命名, 因为他是个历史遗留类, 我们要记住一点, 能用HashMap解决的事情就不要用Hashtable, 这两个类从功能上基本是相同的, 只是Hashtable的每个方法都是同步的, 保证了线程安全, 而最大的问题是Hashtable也是因为他对每个方法都加了锁, 而通常加锁是要根据我们的具体使用情况来定的, 这样一概全加锁的方式是不可取的。 而由此呢, 就出现了HashMap以及HashMap衍生的线程安全类ConcurrentHashMapcurrentHashMap, 你也可以通过Collections.synchronizedMap来获得一个线程安全的MapMap m = Collections.synchronizedMap(new HashMap())
HashSet
从功能上来讲, 跟上面两个完全没关系, 只是HashSet的内部实现使用了HashMap, 就这些区别