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源码阅读理解