集合的底层实现

集合的实现类:《ArrayList》,《LinkedList》,《HashMap》,《HashSet》,《LinkedHashMap》,《LinkedHashSet》,《Hashtable》,《ConcurrentHashMap》
各实现类的底层实现
1》ArrayList
A》ArrayList是list接口的可变数组的非同步实现,允许包含null在内的所有元素。
B》底层使用数组实现。
C》原本数组是定长的,基础数组的长度默认为16,加素因子默认为0.75,可储存长度为16*0.75=12。但是该集合为可变长数组,数组在扩容时,会将老数组拷贝一份到新的数组中,所以就完成了动态添加且不定长度的原因,但是每次数组容量增长,大约是之前容量的1.5倍,这种操作代价很高。
D》ArrayList中的remove方法会让下标到数组末尾的元素向前移动一个单位,并把最后一位的值置空,方便GC。
2》LinkedList
A》LinkedList是list的双向链表非同步实现,允许包括null在内的所有元素。
B》底层的数据结构基于双向链表,该数据结构被称为节点。
C》双线链表对应的类Node的实例,Node中包含的成员变量:prev、next、item。其中prev表示该节点的上一个节点,next表示该节点的下一个节点,item表示该节点的值。
D》它是分两半查找的。先判断index所在的链表,再去对应的链表查找,这样只要遍历一般就能完成。
E》链表本身可以自动增长的,所以是利用链表的特性直接完成动态长度的。
3》HashMap
A》HashMap是基于哈希表中Map接口的非同步实现的,允许使用null值和null键,但不保证映射的顺序
B》底层使用数组实现,数组中的每一项是单向链表,即数组和链表的结合体,当链表的长度大于一定阀值时,链表转化为红黑树,减少链表查询的时间。
C》HashMap在底层将key-value当成一个整体(Node对象)进行处理。HashMap底层采用一个Node[]数组来保存所有的key-value对,当需要存储一个Node对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Node时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Node。
D》HashMap进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能。
4》HashSet
HashSet基于HashMap实现,API也是对HashMap的行为进行了封装

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值