set 接口继承了 collection 接口
主要有两个个实现类 hashset treeset
set 集合的存储是无序的 ,不可重复的。
hashset 底层存储用的是 hashmap,那 hashmap 底层又是什么?
数据结构——HashMap底层实现_Alisazxy的博客-CSDN博客_hashmap底层数据结构 我也是看这个博客的,源码看不懂。。。
jdk 8 以前 hashmap 是数组加链表,默认数组初始长度是16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
为什么默认初始长度要这样写,而不是直接写16呢?
查了一下是因为位运算比普通加减乘除快
jdk8 以后 hashmap 底层是数组加链表加红黑树
数组上的一个位置就能变成一个链表
再说说hashset的无序性,无序性不是随机性,这个无序性是指将数据存储入底层数组(这个数组来自 hashset -> hashmap -> 数组+链表,hashset 最底层是数组)并不是按照先后顺序放入数组,而是通过hash函数(我也不知道这个是什么东西,有空再查查),计算出数据的hash值,再通过算法(简单认为将 hash 值除 数组长度)计算出这个数据再数组中的位置。
如果多个数据都在数组的同一位置上,会先比较数据是否重复,首先比较两个数据的hash值是否相同,在同一数组位置上的数据的hash值可能是不同的,例如 hash值为 1/16(取模) 放在数组第一个位置, 17/16 也是放在数组第一个位置,如果hash值相同就用equals 比较(对象还要重写hashcode方法),如果存储的是基本数据类型没有equals方法用什么比较?
网上没有找到答案,我感觉是通过 == 判断的。。有没有人帮帮我
当已经使用的数组+链表长度达到数组总长度的0.75,数组就会自动扩容,数组总长度扩大为原来的2倍。
再说说hashmap,为什么hashset是单列的,会变成双列的map,什么东西在hashmap里面作为key?什么又做value?
百度了一下。。。。乌烟瘴气
大概是key存放的是引用类型对象的地址(基本类型应该就是把基本数据类型直接放进去,这是我的推断,没有百度到,基本数据类型直接在栈里,引用地址也是在栈里。。。所以。。。,,如果不对,,私密马赛)
value没查出来,大意就是value是一个object类型的对象(这句话抽象的一比,有人懂的话帮帮孩子,求求了。。)
HashSet/HashMap 存取值的过程 - 无名草110 - 博客园 (cnblogs.com) 这个不错
欧 我歇逼了 知识有多又杂
简而言之
hashset 线程不安全 可以存储null
linkset 和hashset 差不多,加了个链表,可以通过链表记录顺序,假装是有序的
treeset 存储相同类型的对象,重写compareTo方法 , 用compareTo 比较对象,树形储存。。什么树?
歪脖子树,,,吊死崇祯那颗