Java集合
文章平均质量分 77
蛙广志
定位抖音直播 server,有需要可以私聊内推
展开
-
【集合-HashMap】手撕HashMap源码,带你一行一行分析,全面且深入,全程干货!
本文全程硬核~!带你深入底层,一行行分析HashMap,由于篇幅可能过程,本文先介绍学习HashMap的前置知识,考虑到全文篇幅过长影响阅读体验,所以将文章分为以下部分:HashMap的一些概念和底层结构HashMap底层是由哈希表存储数据1.要说哈希表,我们先从数组和链表说起:老生常谈了,简单来说就是数组查询快,链表增删快,那有没有一种结构结合两种数据结构的优点,查询快,增删也快?有,那就是哈希表2.哈希表张啥样?table中的每个元素也是链表的头节点,所以哈希表=数组+链表3.HashM原创 2021-04-04 15:41:44 · 171 阅读 · 1 评论 -
【集合-HashMap】源码级理解HashMap之深入构造方法和神奇位运算
壹:HashMap的基本属性//序列化IDprivate static final long serialVersionUID = 362498820763181265L;//哈希表默认的桶数,也就是数组的长度,同时这个容量必须是二的次数幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16//桶的最大数量static final int MAXIMUM_CAPACITY = 1 << 30;//默原创 2021-04-04 15:38:47 · 396 阅读 · 2 评论 -
【集合-HashMap】源码级理解HashMap之get()和remove()方法
壹:get(Object key)方法//调用getNode()方法,获取不到返回null,否则返回key对应的valuepublic V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }//重点在这里 final Node<K,V> getNode(int hash, Object key)原创 2021-04-04 15:38:07 · 440 阅读 · 3 评论 -
【集合-HashMap】源码级理解HashMap之resize()方法,带你一行行手撕
1.为什么要扩容?当容器元素比数组长度大的多时,就会链化眼中,get()操作就会退化成链表的顺序查找,为了提高效率,减弱链化,所以进行扩容壹:一行行带你读源码final Node<K,V>[] resize() { //引用扩容前的哈希表 Node<K,V>[] oldTab = table; //表示扩容前table数组的长度 int oldCap = (oldTab == null) ? 0 : oldTab.length原创 2021-04-04 15:37:36 · 645 阅读 · 4 评论 -
【集合-HashMap】源码级理解HashMap之putVal()方法,一行行手撕源码
public V put(K key, V value) { //调用putVal()方法 //传入的参数:经过哈希扰动和hashcode,key,val,onlyIfAbsent,evict return putVal(hash(key), key, value, false, true); }//这里得到onlyIfAbsent表示如果hash冲突时,新值是否替换旧值,false表示替换//evict我们用不到,暂时不分析final V putVal(int ha原创 2021-04-04 15:37:23 · 1289 阅读 · 9 评论 -
【集合-HashMap】HashMap中sizeForTable,hash()算法中的位运算
HashMap中位运算的运用可以说是神乎其神,也很难理解,接下来让我带你理解以下三种位操作,作者不做标题党,图文并茂你一定能看懂,欢迎交流学习Hash中的位运算- `tableSizeFor()`方法,根据传入容量返回一个`>=cap`的最小二的整数次幂的数- 取模运算`(n - 1) & hash`- Hash()算法中的位运算- tableSizeFor()方法,根据传入容量返回一个>=cap的最小二的整数次幂的数static final int tableSizeFor(in原创 2021-04-02 23:01:57 · 240 阅读 · 1 评论 -
【集合】源码级深入理解LinkedList,点开即食
在讲LinkedList之前,建议先对ArrayList有一个较为深入的理解,这样两者对比之下,就能找到更适合生产环境中的容器类型可以阅读博主的另一边文章,带你全面了解ArrayList,从扩容机制,常见方法,到fail-fast以及并发情况下的问题都有深入分析:深入理解ArrayList由ArrayList引发的思考由于ArrayList底层是由数组存储的,优点很明显:连续存储空间可以由角标在o(1)的时间复杂度内完成缺点:1.对于元素的增删操作最差达到o(n)2.并且存在不断扩容的问题,时间原创 2021-04-01 09:39:20 · 2098 阅读 · 4 评论 -
List,AbstractList,ArrayList是什么关系?
在阅读ArrayList的源码过程中,List接口,AbstractList抽象类和ArrayList集合类之间到底什么关系,这是一种什么设计模式?在源码中这样的设计并不罕见,首先在接口中定义这个家族中所有成员的共性方法,且不管其成员具体的实现方式,集中地规范了该有的共性方法例如List接口中的抽象方法那每个实现类都要全部实现这些方法么?那可太麻烦了,例如size()方法,对于每个List实现类来说都是返回size属性,如果每个都要重写,势必会使代码更加臃肿AbstractList中所以.原创 2021-03-30 21:47:05 · 451 阅读 · 1 评论 -
【集合】ArrayList看这一篇就够了,点开即食~!
ArrayList作为平常使用最多的集合之一,今天就彻彻底底地搞懂它,话不多说,开干!别急,整体把控继承实现关系实现了RandomAccess接口,可以随机访问实现了Cloneable接口,可以克隆实现了Serializable接口,可以序列化、反序列化实现了List接口,是List的实现类之一实现了Iterable接口,可以使用for-each迭代三大接口分析首先三大接口都是标志接口,点开源码可以发现接口中什么代码也没有,只是起到一个标志作用,所以叫标志接口在这原创 2021-03-30 12:17:29 · 571 阅读 · 9 评论