HashSet源码阅读理解

111 阅读1分钟

本文参与「新人创作礼」活动,一起开启掘金创作之路。

我的变强之路

HashSet源码阅读理解

特点

1、hashset数据结构:每个存储的数据对应一个对象(Object),存储的数据作为key 2、用于存储不重复的数据; 3、内部维护一个hashmap 4、无序 5、线程不安全

源码理解:

demo:

public class HashSetDemo {

    public static void main(String[] args) {
    	test();
    }

    public static void test(){
        HashSet<String> set =  new HashSet<>();
        set.add("1");
        set.add("2");
        set.add("3");
    }

}

1、创建HashSet源码: 在这里插入图片描述 map为全局变量,被transient关键字修饰表示HashSet序列化的时候这个map属性不会被序列化到其对象内;(对transient有疑问可以自行实验); 在这里插入图片描述 由此,创建一个HashSet的时候只干了一件事,初始化HashSet内部的一个HashMap类型的全局属性;即HashSet内部维护一个HashMap; 2、add()方法: 在这里插入图片描述 直接将add()中的参数放入map中,注意此处将需要添加的值当作hashmap的key存入;而value则是一个全局属性PRESENT,看下这个PRESENT是什么: 在这里插入图片描述 PRESENT是一个静态的final对象; 由此可知,调用add()方法往HashSet中添加数据等同于将数据作为key、一个Object对象作为value存入一个HashMap中; 因为调用HashMap的put方法时如果key已经存在则更新其value;且HashMap本身就线程不安全; 到这其实HashSet的五个特点都已经验证了;下面看下其他几个常用的方法: 3、contains()方法: 在这里插入图片描述 调用HashMap的containsKey方法判断数据是否存在 4、remove()方法: 在这里插入图片描述 调用HashMap的remove方法删除数据 5、iterator()方法: 在这里插入图片描述 返回map中key的迭代器

总结:HashSet其实就是稍微改造了一下HashMap,把要存的数据当作key用一个静态final对象充当value;底层原理其实都是HashMap实现的,看完HashMap再看HashSet简单的不要不要; ->HashMap源码阅读理解