
数据结构与算法
文章平均质量分 67
LeetCode
Luke.Du
这个作者很懒,什么都没留下…
展开
-
第十二届蓝桥杯省赛javaB组真题分享
填空题A. ASCB. 卡片C. 直线D. 货物摆放E. 路径编程题F. 时间显示G. 最少砝码H. 杨辉三角形I. 双向排序J. 括号序列填空题A. ASCB. 卡片C. 直线D. 货物摆放E. 路径编程题F. 时间显示G. 最少砝码H. 杨辉三角形I. 双向排序J. 括号序列...原创 2021-04-18 18:00:55 · 1586 阅读 · 0 评论 -
HashMap的三种线程安全集合对比(Hashtable,ConcurrentHashMap,Collections.synchronizedMap() )
总结实现的接口的差别初始化时的容量get方法根据下标随机访问的区别HashMap考虑线程安全问题时的选择建议1、总结Hashtable 和 Collections.synchronizedMap() 方法返回的 SynchronizedMap 都是通过锁住整个对象实例的方法确保线程安全的。ConcurrentHashMap 在不发生哈希冲突的情况下尽可能使用 CAS 确保线程安全,在发生哈希冲突情况下采用 synchronized 同步代码块方法锁住当前 Node 结点(只锁当前.原创 2021-03-30 01:21:40 · 896 阅读 · 3 评论 -
ArrayList和LinkedList(源码分析)
底层数据结构的区别实现的接口的差别初始化时的容量get方法根据下标随机访问的区别两者的扩容两者删除元素效率的对比线程安全问题总结ArrayList 底层是数组,而 LinkedList 底层是双向链表。ArrayList 实现了随机访问接口 RandomAccess,允许用下标随机访问。LinkedList 需要从头结点或者尾结点遍历。所以在用下标访问的性能上ArrayList 胜出。ArrayList 的数据结构是数组,也就是顺序表,在删除元素的时候需要前移后面的元素,性能差于L.原创 2021-03-25 20:20:47 · 486 阅读 · 1 评论 -
你真的知道HashMap扩容条件和红黑树升级退化的条件吗?
HashMap扩容条件红黑树升级条件红黑树退化的条件缘由 写这篇文章真的不是为了水博客,作者本人正在写java数据结构相关的文章,也在积极找工作和准备面试,看到好多面试视频里对于 HashMap 扩容和红黑树升级退化的条件说的含糊其辞,于是做了一个汇总。Talk is cheap, I will show you the code.HashMap 扩容条件当 HashMap 中键值对 key-value 个数大于阀值的时候(注意不是什么桶或数组的占用情况)升级成红黑树时,数组长度小..原创 2021-03-20 12:56:57 · 2745 阅读 · 5 评论 -
HashMap与Hashtable的八点区别(源码解析)
区别继承的父类不同初始化数组长度,和扩容时的增量不同是否允许存储空值不同获取Hash值和数组下标的方法不同底层数据结构不同扩容方法不同线程安全问题性能存在差距1. 继承的父类不同HashMap 继承了 AbstractMapHashtable 继承了 Dictionary/* * HashMap源码 *///HashMap继承了AbstractMappublic class HashMap<K,V> extends AbstractMap<K,V&原创 2021-03-18 15:10:36 · 1434 阅读 · 5 评论 -
HashMap 在扩容时为什么通过位运算 (e.hash & oldCap) 得到新数组下标
HashMap在扩容时会把 Node 桶中的元素拆分成两个链表或者红黑树 (分别对应桶为链表或红黑树), - JDK1.8 扩容流程,然后根据位运算来判断 Node 桶中的结点插入两个中的哪一个。(下文中会用 low,high表示)扩容时执行的 resize( ) 方法中的源码,把当前结点插入到 low 还是 high 的判断条件是 (e.hash & oldCap) == 0,那到底这个 & 运算的意义何在呢?首先我们知道 HashMap 计算 key 所对应数组下标的公式是 (l..原创 2021-03-18 08:59:19 · 3378 阅读 · 8 评论 -
HashMap 的 get 方法的流程分析(源码)
流程首先根据 hash 方法获取到 key 的 hash 值然后通过 hash & (length - 1) 的方式获取到 key 所对应的Node数组下标 ( length对应数组长度 )首先判断此结点是否为空,是否就是要找的值,是则返回空,否则进入第二个结点。接着判断第二个结点是否为空,是则返回空,不是则判断此时数据结构是链表还是红黑树链表结构进行顺序遍历查找操作,每次用 == 符号 和 equals( ) 方法来判断 key 是否相同,满足条件则直接返回该结点。链表遍历完都没有找.原创 2021-03-17 16:22:29 · 3713 阅读 · 1 评论 -
HashMap 获取 Hash 值时进行位运算的原因
HashMap 中获取 Hash 值的方法 首先判断 key 是否为 null,为 null 则返回 0 ,所以 key 为空的元素对应的数组坐标一定是 0,而且根据 put 会覆盖相同 key 的逻辑来思考,key 为空的元素最多只有一个。不为 null 则返回 key 的 hashCode异或上它的高16位。static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()原创 2021-03-17 16:05:16 · 695 阅读 · 2 评论 -
Hashmap的长度为什么必须是2的n次方
从源码中我们可以看到获取 key 所对应 Node 数组下标的方法是 (length - 1) & hash,它与我们要求的 hash % length 在 length 是 2 的 n 次方的条件下是等价的,而用这种 & 的位运算的方法相比直接用取余符号进行运算,性能更好。//可以看出源码中获取下标的方法是(n - 1) & hash,n对应数组长度else if ((e = tab[index = (n - 1) & hash]) != null) HashM.原创 2021-03-17 15:50:16 · 346 阅读 · 0 评论 -
HashMap链表升级成红黑树的条件(源码分析)
条件链表长度大于8隐含条件是 Node 数组不为 null 且 Node 数组长度大于等于64 (不满足则会发生扩容代替升级)源码分析 源码中的p是链表的头结点,for循环的第一次, e = p.next 的时候 e 指向链表的第二个元素,此时 binCount = 0,下面升级红黑树的条件是 binCount >= 7。for循环继续走下去,在链表中第九个元素为空的时候 binCount = 7,此时第九个元素刚刚已经插入元素。那么链表长度大于8时就一定会升级成红黑树了吗?让我们看下原创 2021-03-17 15:43:02 · 1972 阅读 · 2 评论 -
HashMap 在 JDK1.8 中的扩容流程(源码分析)
扩容流程1.8版本中扩容时如果 Node 的数据结构是链表会生成 low 和 high 两条链表,是红黑树则生成 low 和 high 两颗红黑树依靠 (hash & oldCap) == 0 判断 Node 中的每个结点归属于 low 还是 high。把 low 插入到 新数组中 当前数组下标的位置,把 high 链表插入到 新数组中 [c] 的位置依靠位运算大幅度提高了 resize( ) 的性能。 - HashMap 在扩容 resize( ) 时为什么能直接通过位运算来得到新.原创 2021-03-17 15:36:19 · 1254 阅读 · 4 评论 -
HashMap中红黑树退化成链表的条件(源码分析)
条件扩容 resize( ) 时,红黑树拆分成的 树的结点数小于等于临界值6个,则退化成链表。移除元素 remove( ) 时,在removeTreeNode( ) 方法会检查红黑树是否满足退化条件,与结点数无关。扩容 resize( ) 的源码分析扩容时如果是红黑树结构会执行红黑树的 split( ) 方法split 方法中会初始化生成 loHead 和 hiHead 两个红黑树的头结点(之后会用 low 和 high 表示)lc 和 hc 分别为 low 和 high 的元素个数,初原创 2021-03-17 15:12:02 · 11952 阅读 · 6 评论 -
HashMap知识点总结(附源码分析链接)
HashMap面试题总结(防备面试官连环提问)HashMap基础讲下对HashMap的认识HashMap的初始化默认参数HashMap的扩容机制HashMap为什么在JDK1.8为添加了红黑树的数据结构链表升级成红黑树的条件红黑树退化成链表的条件为什么Hashmap的长度必须是2的n次幂HashMap获取的Hash值的方法(HashMap可以存key为null的主键吗)为什么在获取hash值时要把key 的 HashCode 和它的低16位做异或HaspMap的初始化时数组长度和加原创 2021-03-17 02:33:56 · 1585 阅读 · 4 评论 -
第十二届蓝桥杯模拟赛(第三期)
第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题Tips 没有收藏题目的可以看看题目,我哪个做错了及时指出来啊,谢谢大家了。(我的解题思路超烂)第一题问题描述 请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。答案800解题思路 可以暴力,从1到2019遍历一下。 2020能被质数 2、5、101整除,遍历从1到2020有多少数是2,5,101的倍数,得到与2020不互为质数的数的个.原创 2021-03-11 23:17:44 · 8017 阅读 · 30 评论 -
滑动窗口问题
滑动窗口问题 牛客网 NC 87 滑动窗口的最大值,题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1},原创 2021-01-28 23:34:11 · 196 阅读 · 0 评论 -
快速排序
快速排序 快速排序采用分治策略。1. 首先拿到数组的第一个数作为target标记数,把数组中比标记数大的都移到它的左边,比标记数小的都移到它的右边。2. 把数组分成标记数之前和之后的两部分,每个部分均按照步骤1中的思路排序。重复上述中1和2操作,直到分成的数组只有一个数时。因为此时数组已经是升序排序了。 很明显重复步骤1和2的操作,适合用递归来完成,而递归的边界条件就是数组中只有一个数。public static void quickSort(int[] dp, int l, int r) {原创 2021-01-18 21:37:45 · 149 阅读 · 0 评论