Java 集合 5:HashSet ,TreeSet 实现原理

HashSet

HashSet 实现了 Set 接口,而 Set 接口是继承于 Collection 接口,所以可以认为 Set 接口是 List 接口的兄弟。

对于 Set 接口,如注释所说:

 * A collection that contains no duplicate elements.  More formally, sets
 * contain no pair of elements <code>e1</code> and <code>e2</code> such that
 * <code>e1.equals(e2)</code>, and at most one null element.  As implied by
 * its name, this interface models the mathematical <i>set</i> abstraction.

所以说不重复,而且HashSet 底层使用的是 HashMap,所以也无序。 这两点是和 List 接口下的 ArrayList,LinkedList 等的一大区别。

我们知道,HashMap 是键值对的形式,HashSet 没有什么键值对的概念,那它内部具体又是怎么利用 HashMap 实现的呢?

其实就是 HashSet 用了一个空对象,如 private static final Object PRESENT = new Object

用这个空对象来填充 HashMap 的 value 域
用这个空对象来填充 HashMap 的 value 域
用这个空对象来填充 HashMap 的 value 域

如下面的 add 方法:

private transient HashMap<E,Object> map;

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

所以从这里就可以看出:

利用了 HashMap 实现。HashSet 的方法就是调用 HashMap 的对应的方法。
用空对象来填充 HashMap 的 value 域

TreeSet

这里需要知道,平常我们所使用的 ArrayList,LinkedList 的元素是按照插入的时候的顺序排列的,而不是按照这个元素的大小之类的排序,假如我们需要有这个功能的话,那么 TreeSet 就派上用场了。

当创建一个 TreeSet 的时候:

private transient NavigableMap<E,Object> m;

public TreeSet() {
    this(new TreeMap<E,Object>());
}
TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}

可以看到,内部是使用了 TreeMap。

当 add(E e) 方法的时候:

private static final Object PRESENT = new Object();

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

也是和 HashSet 一样,令对应的 Map 的 value 域为一个随便不要的对象就行。

其他的方法如:

public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}
public void clear() {
    m.clear();
}

等等都是类似的,这里不再累赘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值