码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 - HashSet、LinkedHashSet 二合一

时间:2020-04-05 11:31:38      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:结构   nts   math   属性   mic   aci   hash   成员   null   

技术图片

简介

HashSet 是HashMap键的封装,我们都知道HashMap是数组+链表或数组+树结构,那么HashSet也是这种结构。HashMap只能存入一个null键,那么HashSet也就只能有一个null值;LinkedHashSet 是LinkedHashMap 键的封装,LinkedHashSet 继承HashSet。

HashSet 类
public class HashSet<E> extends AbstractSet<E>
        implements Set<E>, Cloneable, java.io.Serializable

跟ArraryList相比没有实现RandomAccess接口,接下来看成员变量和构造函数

HashSet 属性
// 底层是HashMap实现的   
private transient HashMap<E,Object> map;
// PRESENT是一个假的value值,帮助用HashMap实现HashSet。
private static final Object PRESENT = new Object();
HashSet 构造函数
public HashSet() {
    map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

通过构造函数可以看出HashSet的初始化时内部构建了一个HashMap对象

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

此构造函数安全级别为默认,只有自己或同包子类可以调用。HashSet并没有调用它,它是给子类使用的,跟上面构造函数唯一的区别就是内部Map换成LinkedHashMap<>对象

HashSet 方法
// 获取长度
public int size() {
    return map.size();
}
// 是否为空
public boolean isEmpty() {
    return map.isEmpty();
}
// 是否包含
public boolean contains(Object o) {
    return map.containsKey(o);
}
// 添加元素
public boolean add(E e) {
    // 添加元素时,元素为键,值为固定常量存入Map
    return map.put(e, PRESENT)==null;
}
// 删除元素
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}
// 清空
public void clear() {
    map.clear();
}

发现了什么?HashSet只是用了HashMap的key,而值是一个固定的常量,所以HashMap的key拥有哪些特性HashSet就拥有哪些特性。
关于HashSet,推荐先看HashMap篇,看完之后才能完全理解HashSet

LinkedHashSet 类
public class LinkedHashSet<E> extends HashSet<E>
        implements Set<E>, Cloneable, java.io.Serializable

LinkedHashSet完成继承HashSet,内部只有构造函数

LinkedHashSet 构造函数
public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);
}
public LinkedHashSet() {
    super(16, .75f, true);
}
public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);
    addAll(c);
}

LinkedHashSet 所有构造函数都调用HashSet的HashSet(int initialCapacity, float loadFactor, boolean dummy)构造函数,内部使用LinkedHashMap对象
技术图片

数据结构 - HashSet、LinkedHashSet 二合一

标签:结构   nts   math   属性   mic   aci   hash   成员   null   

原文地址:https://www.cnblogs.com/yuanjiangnan/p/12636077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!