乐趣区

关于java:HashMap和HashSet的区别

你能够先百度一下 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 Map
private 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。

能够睡觉了 …

退出移动版