关于Set与Map详解!!!

目录

Set

TreeSet

HashSet

LinkedHashSet

Map

TreeMap

HashMap        

LinedHashMap

HashTable

ConcurrentHashMap 


Set

Set是Collection的一个子类,Collection是集合的父类,为什么要有集合?

为了提供一个容器用于存储数据,增加相对应的增删改查的方法,进行整体的封装->类

故集合的目的就是为了管理元素(增删改查)。

Set包含我们的TreeSet、HashSet、LinkedHashSet。共同特点:不支持角标操作,不包含重复元素。

TreeSet

TreeSet,首先我们的TreeSet不允许存在重复值,不同步,不安全,适用于我们的单线程,其底层原理是二分搜索树(左孩子<节点<右孩子),进行中序遍历,利用元素的自然顺序对元素进行自然排序。

public class CollectionSet {
    public static void main(String[] args) {
        TreeSet<Integer> set = new TreeSet<>();
        set.add(7);
        set.add(4);
        set.add(8);
        set.add(3);
        set.add(5);
        set.add(6);
        System.out.println(set);
    }
}

 

HashSet

HashSet的底层原理则是,我们的数组加链表+红黑树实现的,平均每个链表的长度大于8则转化为红黑树进行实现,平均每个红黑树的长度<6,每个红黑树转化为链表。我们HashSet是存储的我们的哈希值,当我们的哈希值相同的时候,我们比较其内容是否相同,若是内容不同,则放入我们同一链表当中。相同则不进入。

上面的小格是我们的角标,比如我们计算完哈希值之后,觉得它应该进入哪个角标,则就进入相对应的链表之中,故我们的HashMap是无序的。而且我们的HashMap是允许空值进入的。

LinkedHashSet

LinkedHashSet是在我们的HashSet上额外添加了一个额外的双向链表,在程序运行的时候,我们的值进入HashSet的同时,也进入我们的额外链表当中,秉承着先进先出的原则。故它是有序的。其他则和我们的HashSet一致。


Map

Map映射—— 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值

TreeMap

其底层大致原理与我们的TreeSet大概一致,只不过将存放的值改成跟了键值对,其次比较的时候只比较我们的键的大小。

HashMap        

底层 数组+链表/红黑树
允许null 键禁止null 无序 不安全

 解决哈希冲突的办法 链地址法 把哈希冲突的元素放到同一个桶里面!!!

LinedHashMap

LinkedHashMap 多了一个链表来管理元素的进入顺序 其他和HashMap一样的

HashTable

底层 数组

禁止null 键禁止null 无序 不安全

如果两个元素计算出来的哈希值和要去的哈希角标一致 称之为哈希冲突
Hashtable中 解决哈希冲突的办法 开放地址法+二次哈希 将冲突的元素后置存放

将哈希冲突的元素进行后置存放,为了关联哈希值一样的元素,Entry结点中有一个next来进行关联元素
函数功能来自Map

ConcurrentHashMap 

具体参考我们的HahsMap,是它的线程安全版,是同步的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值