java分析集合框架原理汇总

目录

一、List

二、Set

三、Map


首先来一份集合框架图

一、List

1.ArrayList(数组)

        1)初始化

        无参数

                jdk1.7,默认容量为10;

                jdk1.8,初始化为空数组,add数据时,初始化容量为10。

        有参数,根据设置的容量值进行初始化。

        2)原理,add时,先判断是否扩容,再存储值,扩容过程有对数组进行复制、移动,代价比较高。

2.Vector(数组实现,线程同步)

同Arraylist,初始化容量默认为10,add和get时,使用synchronzied同步锁,所以线程安全。

3.LinkedList(链表)

使用链表结构,单个元素通过next、prev两个属性来实现双向链表结构,适合数据的动态插入和删除,可以当做堆栈、队列和双向队列使用。

二、Set

对象的相等性本质是根据对象的hashcode值(java是依据对象的内存地址计算出的此序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆写Object的hashcode方法和equals方法。

1.HashSet(HashMap)

        1)线程不安全

        2)原理,HashSet底层就是一个HashMap结构,add的值,存的是HashMap的key,而对应的值(value)是固定的Object。

2.TreeSet(TreeMap)

        1)线程不安全

        2)原理,TreeSet底层就是一个TreeMap结构,即红黑树结构。add的值,存的是TreeMap的key,而对应的值(value)是固定的Object。

3.LinkedHashSet(HashSet + LinkedHashMap)

        1)线程不安全

        2)原理,LinkedHashSet底层就是一个LinkedHashMap结构,即HashMap+双向链表结构。add的值,存的是LinkedHashMap的key,而对应的值(value)是固定的Object。

三、Map

HashTable、HashMap、ConcurrentHashMap的内容比较多,请参考文章:《分析HashTable,HashMap,ConcurrentHashMap的结构、初始化及扩容机制》。

1.TreeMap(可排序)

        1)线程不安全

        2)结构:红黑树,单个Entry<k,v>就代表红黑树的一个节点。

        3)初始化

无参数,默认按键的大小进行升序排序;

有参数,可自定义比较器,按比较器规则进行排序。

        4)原理,put时,从根节点进行比较,基于红黑树原理,先找到位置存储,然后再通过fixAfterInsertion方法调整树结构(平衡、颜色等),使其满足红黑树条件。

2.LinkedHashMap(记录插入顺序)

        1)线程不安全

        2)结构:HashMap + 双向链表

        3)原理,LinkedHashMap继承自HashMap,所以底层结构与HashMap结构一致,put方法调的就是HashMap的put方法,get方法做了复写。相比于HashMap,LinkedHashMap额外维护一个双向链表,即在原有的Entery<k,v>结构中,增加了before、after两个属性,用于记录插入顺序,其头结点为head,注意,维护的双向链表并不是重新创建一份包含before、after的Entry<k,v>数据,只是从另一个维度(双向链)来看LinkedHashMap的数据结构,其本质仍是HashMap。用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

以上就是本篇的全部内容,如有错误,欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值