zoukankan      html  css  js  c++  java
  • HashSet源码分析

    HashSet源码分析

    简介

    HashSet不能存放重复的值,且不保证存放的顺序。

    类结构

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

    HashSet继承自AbstractSet并重写了方法

    HashSet实现可Cloneable接口,可被克隆

    HashSet实现了Serializable接口,可以被序列化

    属性

    //维护了一个HashMap,正是用这个HashMap来实现的去重
    private transient HashMap<E,Object> map;
    
    //用于HashMap存放时的value,节约空间
    private static final Object PRESENT = new Object();
    

    构造器

    //无参构造器,初始化了HashMap
    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);
        }
    
    //同指定初始化大小和加载因子的构造器,第三个参数预留
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
            map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }
    
    

    方法

    iterator()获取迭代器

    public Iterator<E> iterator() {
      //使用的是HashMap的KeySet的迭代器
            return map.keySet().iterator();
        }
    

    contains(Object)方法判断HashSet中是否已经包含该元素了

    public boolean contains(Object o) {
      //直接调用HashMap的方法判断是否包含key
            return map.containsKey(o);
        }
    

    add(E)方法添加元素

    public boolean add(E e) {
      //把元素当做是key,value用预设的默认值,即用HashMap不能存放重复key的特性去重
            return map.put(e, PRESENT)==null;
        }
    

    remove(Object)方法移除元素

    public boolean remove(Object o) {
      //把HashMap中key对应的节点去除
            return map.remove(o)==PRESENT;
        }
    
  • 相关阅读:
    [转]MFC与Qt的内存管理
    [转]QT项目生成流程例图
    [转]vc中nmake.exe cl.exe 的使用
    android_layout_linearlayout(二)
    android_layout_relativelayout(一)
    android_layout_linearlayout(一)
    android_layout_relativelayout(二)
    android_activity_研究(一)
    两个线程解决一个线程卡之路
    android_layout_framelayout
  • 原文地址:https://www.cnblogs.com/moyuduo/p/12723443.html
Copyright © 2011-2022 走看看