• HashSet源码分析


    在java集合中有一种集合Set(集),他有两个实现类,分别是HashSet,TreeSet。下面仔细分析HashSet源码。

    看了HashSet的源码就会发现HashSet的底层实现是利用HashMap,所以对于HashSet的一些操作都是利用HasgMap的操作实现的。生命类一个HashMap成员变量,在构造方法中创建这个HashMap。

    HashSet有多个重载的构造方法,最终都是创建HashMap,看第二个构造方法中包含两个参数,这里先简单说一下这个0.75是什么,这个0.75(负载因子)是传近HashMap的参数,HashMap都用到了这个负载因子,当创建一个HashMap时,他不会等到全部装满再扩容,当创建16个长度的HashMap时,在元素装到16*0.75=12个的时候就要扩容,后期在分析HashMap时会详细说明。


    注意最后一个构造方法是创建了一个LinkedHashMap对象,但是底层也是调用了HashMap的构造方法

    看他的遍历方法,由于HashSet是用HashMap实现存储的,所以对HashSet遍历就是对HashMap进行遍历,HashMap的遍历可以通过keySet()方法转换成Set集合再调用iterator()方法迭代遍历。


    既然说HashSet使用HashMap实现的,HashMap是Map的存储使用键值对存储的,这里为什么只把HashMap的键转化成了Set,值呢?这里要说一下add()方法,利用HashMap的put方法实现添加元素,var1是值,后面PRESENT其实是一个空的Object数组,这个数组在类加载的时候ijiu已经创建好了,后期也没有去添加元素。利用HashMap实现HashSet,Map集合用键值对存储,Set集合只是存储普通的对象,不是以键值对形式存储,为了模拟,jdk创建了一个假的键值对,只存键,对于值呢,用一个空的Object数组代替,也就是这个键是真的,所有的值都是假的,一个空的数组。

    剩下的其他常用的方法都是调用HashMap的方法


    TreeSet的实现和HashSet的实现基本一致,也是调用TreeMap实现,在Terr的结构中都加入了比较器,在加入元素后为元素进行排序,所以我们在输出元素的时候总是有序的。

  • 相关阅读:
    数据库unsigned char*类型图片存进
    int main(int argc, char *argv[])中的argc和argv
    数据库任务进度记录
    数据库存入数据后id保持不变,或者直接报错
    数据库图片存入并显示成功,但查询时不能全显示
    数据库存入图片成功但显示不出来
    JWT(Json web token)认证详解
    重启eclips后启动项目出现监听文件找不到
    解决服务器连接错误Host ‘XXX’ is not allowed to connect to this MySQL server
    Linux系统常用命令
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816555.html
Copyright © 2020-2023  润新知