【面试专栏】第六篇:Java基础:集合篇-HashSet、TreeSet

🎉Set

  • 没有顺序,不可重复

HashSet(底层是HashMap)

  • Set不允许元素重复、无序
  • 基于HashMap实现,无容量限制
  • 是非线程安全的
  • 扩容机制与HashMap一致
  • Fail-fast 模式迭代器

成员变量

可以看到是基于HashMap 实现,PRESENT 去填充map 的 value 节省空间,利用了map key的唯一性

private transient HashMap<E,Object> map;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

构造方法

构造方法中创建的是一个hashmap

/**
 * 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<>();
}
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

添加

根据map中的特性来判断是否存在,添加成功

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

删除

相同使用map的remove方法

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

遍历

public Iterator<E> iterator() {
    return map.keySet().iterator();
}

包含

public boolean contains(Object o) {
    return map.containsKey(o);
}

🎉TreeSet(底层是TreeMap)

  • 基于TreeMap实现,支持排序(自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序)
  • 是非线程安全的
  • Fail-fast 模式迭代器
  • 实现了NavigableSet 接口,支持排序与其他一些扩展
    • 直接获取符合条件的最近的元素,这里条件主要是 lower(>)、 floor(>=)、 higher(<)、 ceiling(<=)。如果符合条件的元素不存在,就返回 null。
    • 逆向访问:descendingSet,descendingIterator
    • 获取并弹出最大/最小值:pollFirst,pollLast
    • 增强了 subSet 和 tailSet
    • SortedSet 返回的集合边界是左闭右开的(也就是说,[a, b)),NavigableSet 提供了另一个版本,制定左右边界是否闭合。

成员变量

其中包含了一个NavigableMap,具体传入构造的是TreeMap(TreeMap 继承了 NavigableMap)

/**
 * The backing map.
 */
private transient NavigableMap<E,Object> m;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

构造方法

直接传入的就是TreeMap

public TreeSet() {
    this(new TreeMap<E,Object>());
}
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

添加

然后下面就是map的常规调用操作

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

删除

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

遍历

public Iterator<E> iterator() {
    return m.navigableKeySet().iterator();
}

包含

public boolean contains(Object o) {
    return m.containsKey(o);
}

基于SortedMap ,获取开头

基于SortedMap 做的实现,有顺序才有开头和结尾

public E first() {
    return m.firstKey();
}

获取结尾

public E last() {
    return m.lastKey();
}

NavigableMap 实现的功能

  • 子集
    同样有顺序才能从一个到另一个中间生成子集
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
                              E toElement,   boolean toInclusive) {
    return new TreeSet<>(m.subMap(fromElement, fromInclusive,
                                   toElement,   toInclusive));
}
  • 默认是含头不含尾
public SortedSet<E> subSet(E fromElement, E toElement) {
    return subSet(fromElement, true, toElement, false);
}

SortedSet功能


public interface SortedSet<E> extends Set<E> {
    /**
     * 返回比较器,如果是自然排序返回 null 
     */
    Comparator<? super E> comparator();

    /**
     * 返回 e1 和 e2 之间的元素,包括 e1,不包括 e2
     */
    SortedSet<E> subSet(E fromElement, E toElement);

    /**
     * 返回 e 之前的元素,不包括 e
     */
    SortedSet<E> headSet(E toElement);

    /**
     * 返回 e 之后的元素,不包括 e
     */
    SortedSet<E> tailSet(E fromElement);

    /**
     * 返回第一个元素
     */
    E first();

    /**
     * 返回最后一个元素
     */
    E last();

    @Override
    default Spliterator<E> spliterator() {
        return new Spliterators.IteratorSpliterator<E>(
                this, Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED) {
            @Override
            public Comparator<? super E> getComparator() {
                return SortedSet.this.comparator();
            }
        };
    }
}


NavigableSet的功能



public interface NavigableSet<E> extends SortedSet<E> {
    /**
     * 严格返回小于元素e的最大元素,没有则返回null
     */
    E lower(E e); 
 
    /**
     *返回小于或者等于元素e的最大元素,没有则返回null
     */
    E floor(E e);
 
    /**
     * 返回大于或者等于元素e的最小元素,没有则返回null
     */
    E ceiling(E e);
 
    /**
     * 严格返回大于元素e的最小元素,没有则返回null
     */
    E higher(E e);
 
    /**
     * 返回并移除集合中第一个元素,没有则返回null
     */
    E pollFirst();
 
    /**
     * 返回并移除集合中最后一个元素,没有则返回null
     */
    E pollLast();
 
    /**
     * 按升序返回此集合中元素的迭代器
     */
    Iterator<E> iterator();
 
    /**
     * 返回包含该集合中元素的逆序视图
     */
    NavigableSet<E> descendingSet();
 
    /**
     * 按降序返回此集合中元素的迭代器。
     */
    Iterator<E> descendingIterator();
 
    /**
     * 返回集合中在fromElement到toElement的元素构成的新集合,fromInclusive和toInclusive表示是否包含头和尾
     */
    NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
                           E toElement,   boolean toInclusive);
 
    /**
     * 返回小于toElement的元素构成的新集合,inclusive表示是否包含元素toElement
     */
    NavigableSet<E> headSet(E toElement, boolean inclusive);
 
    /**
     * 返回大于toElement的元素构成的新集合,inclusive表示是否包含元素fromElement
     */
    NavigableSet<E> tailSet(E fromElement, boolean inclusive);
 
    /**
     * <p>Equivalent to {@code subSet(fromElement, true, toElement, false)}.
     * 返回集合中在fromElement到toElement的元素构成的新集合,fromInclusive和toInclusive表示包含头不包含尾
     */
    SortedSet<E> subSet(E fromElement, E toElement);
 
    /**
     * <p>Equivalent to {@code headSet(toElement, false)}.
     * 返回小于toElement的元素构成的新集合,不包含元素toElement
     */
    SortedSet<E> headSet(E toElement);
 
    /**
     * <p>Equivalent to {@code tailSet(fromElement, true)}.
     * 返回大于toElement的元素构成的新集合,不包含元素toElement
     */
    SortedSet<E> tailSet(E fromElement);

}
  • 36
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木秀林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值