HashSet学习笔记

基础介绍

  • 无序
  • 不重复
  • 无索引

继承关系

1.实现Cloneable接口

2.实现java.io.Serializable接口

3.继承AbstractSet抽象类

构造器

1.空参构造:构造一个新的空集合;后备 HashMap 实例具有默认初始容量 (16) 和负载系数 (0.75)。

public HashSet() {  
    map = new HashMap<>();  
}

2.有参构造:传入指定数组容量

public HashSet(int initialCapacity) {  
    map = new HashMap<>(initialCapacity);  
}

3.有参构造:传入指定初始容量和荷载系数

public HashSet(int initialCapacity, float loadFactor) {  
    map = new HashMap<>(initialCapacity, loadFactor);  
}

4.有参构造:传入一个Collection的子类,创建一个hashmap,负载系数还是0.75,容量就根据传入的子类中元素数量来判断,将元素数*0.75+1与16比较,哪个大选哪个,然后再把数据加到map中

public HashSet(Collection<? extends E> c) {  
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));  
    addAll(c);  
}

总结

HashSet的底层重写代码没多少,都是调用hasnmap的方法进行实现
在数据存储的过程中,实际上是创建了一个hashmap,并将数据写入到hashmap中,该节点的key即为原数据,value则为一个底层默认创建的PRESENT,map通过hashcode保证key的不重复性,也就保证了set的不重复性。

private static final Object PRESENT = new Object();

因为没有索引,也没有get方法,若要获取hashset中的值,则需要对hashset生成迭代器对象Iterator来获取数据,因为没有那些next,before,after属性,因此数据与存入时的顺序是不一致的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值