Java集合 HashSet的源码分析及常用方法讲解

一. HashSet概述

  • HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet,并继承了Collection,HashSet集合很常用,同时也是程序员面试时经常会被问到的知识点,下面是结构图
    Java集合 HashSet的源码分析及常用方法讲解_第1张图片

二、源码分析

  • 初始化
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;	//java序列化机制

    private transient HashMap<E,Object> map;	//将不需要序列化的属性前添加关键字transient   是不是很熟悉这个map 哈哈哈

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
}
  • 构造器
	//默认构造器
	public HashSet() {
        map = new HashMap<>();
    }
    //将传入的集合添加到HashSet的构造器
    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);
    }
    //仅明确初始容量的构造器(装载因子默认0.75)
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }
  1. 看完hashSet的构造器想必大家已经很不陌生了吧,这简直是一个非常完美的偷天换日 皮包公司 哈哈哈(接到活,直接丢给map处理
  2. HashMap的数据存储是通过数组+链表/红黑树实现的,存储大概流程是通过hash函数计算在数组中存储的位置,如果该位置已经有值了,判断key是否相同,相同则覆盖,不相同则放到元素对应的链表中,如果链表长度大于8,就转化为红黑树,如果容量不够,则需扩容(注:这只是大致流程)。

hashMap原理及底层实现,储存过程

  • 能懂得map的基本hashSet你就能看明白
  • 这里就简单列出常用方法吧:(就不一一讲述了)
public int size()	// 集合中元素个数

public boolean isEmpty()	// 是否为空

public boolean contains(Object o)	// 是否包含指定元素

public boolean add(E e)	// 添加元素

public boolean remove(Object o)	// 删除元素

public void clear()	// 删除所有元素

java集合 arrayList源码分析add方法自动扩容机制(上)

作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。

你可能感兴趣的:(日常栏目,java)