大家可以先百度一下HashMap和HashSet的区别,答案很多,包括但不限于:HashMap实现了Map接口,HashSet实现了Set接口。HashMap是key/value存储的集合,HashSet是存储对象的组合。HashMap不允许有重复的键,但允许有重复的值,而HashSet不允许有重复的元素。HashMap允许一个key为空和多个value为空,而HashSet允许一个为空value。HashMap使用put()将元素添加到映射中,而HashSet使用add()将元素放入集合中。HashSet比HashMap慢。可能还有其他的……上面1~5条应该是正确的。第6项不知道怎么弄的,肯定是错的。如果只是想知道它们的区别,记得百度之后查对错,挑对的记下来就好了。但是建议大家记住以下几点:HashSet底层其实就是HashMap,除了封装后暴露出来的方法和HashMap不同(比如add方法和put方法的区别),HashSet和HashMap其实没有区别!如果你不相信我,只要看看HashSet的源代码:/***构造一个新的空集;后备HashMap实例具有*默认初始容量(16)和负载因子(0.75)。*/publicHashSet(){map=newHashMap<>();}仔细看看(说错了,随便看看),你会发现:HashSet数据其实是存放在成员变量map中的,而map是一个哈希图。HashSet包含一个称为虚拟值的对象对象。创建HashSet时,会为每个与该虚拟对象匹配的键生成一个HashMap。所以说白了,你可以这样理解:HashSet其实默认为所有的键值匹配一个空的Object对象。哈希图。HashSet的add方法调用了HashMap的put方法。不仅如此,Hashset的contains()、size()、isEmpty()、iterator()……等很多方法都调用了HashMap的相应方法。那你说这两者有什么区别?从底层数据结构来看,其实就是同一头驴,在不同的场合给不同的衣服,拉出来散步。只是他的一些功能是有限制的,在特定的场合是不允许使用的。所以,其实我们可以这样看待HashSet:HashSet的底层是HashMap。这个很重要,我们不用再去分析Hashset的底层数据结构了。HashSet只允许存储元素而不是键值对。HashSet可以通过add添加元素,通过contains判断元素是否存在。由于HashMap不允许有重复的key,因此可以得出HashSet不允许存储重复元素的结论。Hashset只允许存储一个Null对象。不啰嗦了,几乎HashSet的所有特性都可以从HashMap衍生出来。另外,省事:LinkedHashSet对应LinkedHashMap,TreeSet对应TreeMap。我现在可以睡觉了...
