set集合基础

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 比较对象,树形储存。。什么树?

歪脖子树,,,吊死崇祯那颗

 

上一篇:JAVA集合系列之-HashSet


下一篇:centos 6.8 设置svn钩子同步至web目录