你能够先百度一下 HashMap和HashSet的区别,有很多答案,包含但不限于:

  1. HashMap实现了Map接口,HashSet实现了Set接口。
  2. HashMap是保留key/value的汇合,HashSet是保留对象的联合。
  3. HashMap不容许反复的键,然而容许反复的值,HashSet不容许反复的元素。
  4. HashMap容许有一个键为空,多个值为空,HashSet容许有一个空值。
  5. HashMap中应用put()将元素退出map中,而HashSet应用add()将元素放入set中。
  6. HashSet较HashMap来说比较慢。

可能还有其余的......

以上1~5应该是对的,第6条不晓得是怎么得出的,必定不对。

你如果就是想晓得一下他们的区别,记得百度之后甄别一下对错,挑选出正确的记下就是了。

然而我倡议你记住以下一条就对了:

HashSet底层其实就是HashMap,HashSet除了封装之后裸露进去的办法和HashMap不同之外(比方add办法和put办法的区别),其实没有什么鸟区别!

不信你就看看HashSet源码:

private transient HashMap<E,Object> map;

// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();/** * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75). */public HashSet() {    map = new HashMap<>();}

认真看一眼(说错了,简略看一眼),你就会发现:

  1. HashSet数据其实存储在成员变量map中,map就是个HashMap。
  2. HashSet蕴含了一个叫 dummy value的object对象,创立HashSet的时候为每一个key匹配这个dummy object生成HashMap,所以说白了,你能够了解为:HashSet其实就是为所有key值都默认匹配一个空的Object对象的HashMap。
  3. HashSet的add办法,调用的是HashMap的put办法。
  4. 不止,Hashset的contains()、size()、isEmpty()、iterator()...等等一众办法,调用的都是HashMap对应的办法。

所以你说他们两个有什么区别?从底层数据结构的角度看,他们其实就是同一头驴子,在不同的场合给他一个不同的披挂,拉进去遛而已。只不过在某些场合他的某些性能被限度了不让用,而已。

所以,其实咱们能够这么对待HashSet:

  1. HashSet底层就是HashMap。这一点很重要,咱们就不再须要剖析Hashset的底层数据结构了。
  2. HashSet只容许存储元素而不容许存储键值对。
  3. HashSet能够通过add减少元素,通过contains判断元素是否存在。
  4. 因为HashMap不容许反复的键,所以能够得出,HashSet不容许存储反复的元素。
  5. Hashset容许存储惟一的一个Null对象。

不啰嗦了,HashSet的简直所有个性都能够由HashMap推导进去。

此外,省点力量:LinkedHashSet对应LinkedHashMap,TreeSet对应TreeMap。

能够睡觉了...