- 博客(192)
- 资源 (3)
- 收藏
- 关注

原创 JVM 笔记01——最全、最详细的Java内存区域教程
文章目录Java内存区域运行时数据区域程序计数器Java 虚拟机栈本地方法栈堆方法区方法区和永久代的关系常用参数元空间运行时常量池直接内存HotSpot虚拟机对象探秘对象的创建Step1:类加载检查Step2:分配内存Step3:初始化零值Step4:设置对象头Step5:执行 init 方法对象的内存布局对象头对象自身的运行时数据类型指针实例数据对齐填充对象的访问定位String 类和常量池字符...
2020-03-15 11:06:08
362

原创 哈夫曼树及哈夫曼编码详解【完整版代码】
Huffman Tree简介    赫夫曼树(Huffman Tree),又称最优二叉树,是一类带权路径长度最短的树。假设有n个权值{w1,w2,…,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,…,wn},则所构造出的带权路径长度最小的二叉树就被称为赫夫曼树。  &a
2018-06-17 11:42:30
119045
58
原创 自定义阻塞队列和自定义线程池
自定义阻塞队列package jucdemo;import java.util.Collection;import java.util.Iterator;import java.util.LinkedList;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;/** * @autho
2021-02-27 17:54:47
627
原创 【Spring源码】IOC和AOP源码分析
IOCIOC(Inverse of Control: 反转控制)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IOC 在其他语言中也有应用,并非 Spring 特有。 IOC 容器是 Spring 用来实现 IOC 的载体, IOC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IO
2021-01-23 23:42:57
853
原创 【Java集合源码05】PriorityQueue源码分析
简介PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素默认按照升序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,
2021-01-11 21:13:47
360
原创 【Java集合源码04】Stack源码分析
简介Stack是栈,先入后出,继承自Vector,所以是线程安全的。遗留类,不推荐使用,可用Deque模拟战。本质上还是用数组实现的,数组尾部就是栈顶。Deque<Integer> stack = new LinkedList<>();stack.addFirst(12);stack.pollFirst(); 源码源码比较简单package java.util;publicclass Stack<E> extends Vector<E&g
2021-01-08 15:29:56
288
原创 【Java集合源码03】Vector源码分析
简介Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:Vector 是同步访问的。Vector 包含了许多传统的方法,这些方法不属于集合框架。Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。Vector是线程安全的,但是是遗留类,不推荐使用。内部使用Object数组实现,通过加全局锁synchronized实现线程安全。默认容量为10. Vector源码分析基于jdk1.8源码源码很简单,没查可说的get
2021-01-07 12:37:36
183
原创 多线程和高并发(七)
SingleThreadExecutor单线程线程池,可以保证任务顺序执行,还可以进行生命周期管理。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author wardseptember * @create 2020-07-09 16:01 */public class SingleThreadPoolDemo { public static void
2020-12-14 08:11:43
246
原创 多线程和高并发(六)
阻塞队列在多线程领域:所谓阻塞,即在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒。当阻塞队列是空时,从队列中获取元素的操作将会被阻塞当阻塞队列是满时,往队列里添加元素的操作将会被阻塞Queue和ListQueue提供了一些对线程友好的API,Offer、peek、pollBlockingQueue提供Put take有阻塞的功能ArrayBlockingQueue由数组结构组成的有界阻塞队列LinkedBlockingQueue由链表结构组成的有界阻塞队列,默认
2020-12-13 14:58:04
247
原创 多线程和高并发(五)
LockSupportLockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。常用方法:public static void park(Object blocker); // 暂停当前线程public static void parkNanos(Object blocker, long nanos); // 暂停当前线程,不过有超时时间的限制public static void parkUntil(Object blocker,
2020-12-11 19:38:52
223
原创 多线程和高并发(四)
ReentrantLock使用Reentranlock必须要手动释放锁,并且加锁次数和释放锁次数要一样。synchronized如果遇到异常的话,jvm会自动释放锁。import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class T02_ReentrantLock2 { Lock
2020-12-10 19:12:39
206
2
原创 【Java集合源码02】LinkedList源码分析
简介LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性; LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法:List list=Collections.synchronizedList(new LinkedList(...)); 实
2020-12-03 13:28:35
231
1
原创 【Java集合源码01】ArrayList源码分析
1. ArrayList 简介ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。ArrayList继承于 AbstractList,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。public class ArrayList<E>
2020-12-02 22:02:28
317
原创 栈和队列面试题总结
文章目录用栈实现队列解法用队列实现栈解法最小栈解法剑指 Offer 59 - II. 队列的最大值解法有效的括号解法每日温度解法下一个更大元素 II解法剑指 Offer 59 - I. 滑动窗口的最大值双端队列推荐阅读用栈实现队列232. 用栈实现队列使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。 示例:MyQueue queue = ne
2020-11-30 13:08:32
383
原创 链表面试题总结
文章目录剑指 Offer 06. 从尾到头打印链表利用栈逆向输入数组剑指 Offer 24. 反转链表迭代解法递归解法剑指 Offer 18. 删除链表的节点解法删除排序链表中的重复元素解法1解法2递归删除链表的倒数第N个节点解法剑指 Offer 22. 链表中倒数第k个节点快慢指针剑指 Offer 35. 复杂链表的复制解法剑指 Offer 52. 两个链表的第一个公共节点解法合并两个有序链表非递归解法递归解法两两交换链表中的节点解法两数相加 II解法回文链表解法解法2分隔链表解法奇偶链表解法1解法2推荐
2020-11-29 16:17:45
460
原创 数组面试题总结
文章目录剑指 Offer 03. 数组中重复的数字解法剑指 Offer 53 - I. 在排序数组中查找数字 I解法二分查找另一种写法剑指 Offer 53 - II. 0~n-1中缺失的数字解法等差数列二分法移动零解法1解法2最大连续1的个数解法剑指 Offer 04. 二维数组中的查找解法有序矩阵中第K小的元素二分查找法堆排序剑指 Offer 29. 顺时针打印矩阵解法重塑矩阵解法错误的集合解法寻找重复数双指针优美的排列 II解法数组的度解法托普利茨矩阵解法数组嵌套解法最多能完成排序的块解法剑指 Of
2020-11-28 19:54:55
401
原创 字符串面试题总结(终极版)
文章目录有效的字母异位词解法最长回文串解法同构字符串解法回文子串解法回文数解法计数二进制子串解法剑指 Offer 58 - I. 翻转单词顺序解法剑指 Offer 58 - II. 左旋转字符串解法剑指 Offer 67. 把字符串转换成整数解法有效的字母异位词242. 有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat
2020-11-24 17:41:12
2738
原创 多线程和高并发(三)
公平锁和非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁非公平锁,是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,多个线程争夺锁。在高并发情况下,有可能会造成优先级反转或者饥饿现象。reentranlock和synchronized默认是非公平锁。可重入锁和递归锁可重入锁又名递归锁,指的是同一线程外层函数获得锁后,内层递归函数仍然能获得该锁的代码,即线程可以进入任何一个它已经拥有的锁,所同步着得代码块。可重入锁最大的作用是避免死锁。reentr
2020-11-19 20:05:25
242
原创 二叉树面试题刷题模板[终极版]
文章目录递归树结构二叉树的最大深度后序递归二叉树最小深度后序递归二叉树的直径后序递归平衡二叉树后序递归小总结对称的二叉树递归解法二叉树的镜像后序递归树的子结构递归解法二叉搜索树的最近公共祖先前序递归二叉树的最近公共祖先前序递归二叉搜索树的第k大节点中序递归二叉树中和为某一值的路径前序递归538. 把二叉搜索树转换为累加树类中序递归669. 修剪二叉搜索树前序递归找树左下角的值前序递归遍历左叶子之和递归遍历最长同值路径后序递归二叉树中第二小的节点递归遍历572. 另一个树的子树前序递归合并二叉树前序递归路径总
2020-11-18 22:00:26
625
原创 多线程和高并发(二)
多线程核心基础创建线程public class CreateNewThread { // 第一种创建方式 static class MyThread extends Thread { @Override public void run() { System.out.println("T1"); } } // 第二种创建方式 static class Myrun implements Runna
2020-11-07 14:58:20
208
原创 多线程和高并发(一)
进程和线程进程和线程基础教程见进程和线程多线程高并发基础上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个 任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这 个任务的状态。所以任务从保存
2020-11-07 14:56:03
215
原创 三次握手、四次挥手、重传机制、滑动窗口、流量控制、拥塞控制、TCP/UDP全解析
文章目录UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 重传机制超时重传快速重传SACK方法Duplicate SACK*栗子一号:ACK 丢包**栗子二号:网络延时*TCP 滑动窗口TCP 流量控制操作系统缓冲区与滑动窗口的关系窗口关闭糊涂窗口综合症TCP 拥塞控制慢启动拥塞避免算法拥塞发生发生超时重传的拥塞发生[算法]()发生快速重传的拥塞发生[算法]()快速恢复参考链接公众号网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。
2020-10-13 16:56:22
615
原创 HashMap详解——基于jdk1.8和jdk1.7
HashMap 1.7使用数组加链表实现hashmap。hashmap初始容量为16,装载因子为0.75,hashmap里面的元素达到阈值(阈值=容量 * 装载因子)时,就会进行扩容,每次扩容2倍。put方法 public V put(K key, V value) { // 当第一次往里面放元素时才真正地申请空间 if (table == EMPTY_TABLE) { inflateTable(threshold); }
2020-09-28 15:55:02
427
原创 LeetCode题解——随机刷题(四)
文章目录448. 找到所有数组中消失的数字解法438. 找到字符串中所有字母异位词滑动窗口581. 最短无序连续子数组遍历560. 和为K的子数组前缀和+哈希表919. 会议室 II排序621. 任务调度器排序推荐阅读448. 找到所有数组中消失的数字448. 找到所有数组中消失的数字给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复
2020-09-17 14:32:37
352
原创 LeetCode题解——随机刷题(二)
文章目录114. 二叉树展开为链表寻找前驱节点221. 最大正方形动态规划301. 删除无效的括号回溯算法312. 戳气球动态规划399. 除法求值并查集推荐阅读114. 二叉树展开为链表114. 二叉树展开为链表给定一个二叉树,原地将它展开为一个单链表。 例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5
2020-09-14 22:35:00
303
原创 LeetCode题解——随机刷题(三)
文章目录48. 旋转图像解法49. 字母异位词分组解法56. 合并区间排序85. 最大矩形单调栈96. 不同的二叉搜索树解法推荐阅读48. 旋转图像48. 旋转图像给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,
2020-09-04 19:18:19
300
原创 LeetCode题解——随机刷题(一)
文章目录146. LRU缓存机制哈希表和双向链表152. 乘积最大子数组动态规划2. 两数相加直接遍历4. 寻找两个正序数组的中位数解法5. 最长回文子串双指针11. 盛最多水的容器双指针15. 三数之和双指针推荐阅读146. LRU缓存机制146. LRU缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数
2020-08-24 15:57:11
538
原创 剑指Offer题解大全(分类刷题、高效搞定数据结构)
在线阅读Github PagesNotes镜像地址本项目Java代码测试全通过。核心内容分类刷题,效率更高,效果更好。数据结构篇字符串数组二叉树(一)二叉树(二)链表栈和队列位运算和哈希表数学算法篇排序、回溯和分治递归和堆动态规划随机刷题(一)随机刷题(二)随机刷题(三)可视化数据结构这是个学习数据结构的神器,基本上包含常用数据结构的所有可视化过程哦。下图是红黑树插入节点和删除节点的演示,关注公众号大数据技术与机器学习,后台回复"可视化数据结构
2020-08-17 17:05:57
342
原创 剑指Offer题解——随机刷题(三)
文章目录剑指 Offer 60. n个骰子的点数动态规划剑指 Offer 61. 扑克牌中的顺子set集合排序+遍历剑指 Offer 62. 圆圈中最后剩下的数字解法剑指 Offer 64. 求1+2+…+n递归快速乘剑指 Offer 65. 不用加减乘除做加法位运算剑指 Offer 66. 构建乘积数组动态规划推荐阅读剑指 Offer 60. n个骰子的点数剑指 Offer 60. n个骰子的点数把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要
2020-08-17 16:02:55
348
原创 剑指Offer题解——随机刷题(二)
文章目录剑指 Offer 51. 数组中的逆序对分治算法剑指 Offer 56 - I. 数组中数字出现的次数位运算剑指 Offer 56 - II. 数组中数字出现的次数 II位运算剑指 Offer 57. 和为s的两个数字双指针剑指 Offer 57 - II. 和为s的连续正数序列双指针推荐阅读剑指 Offer 51. 数组中的逆序对剑指 Offer 51. 数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
2020-08-15 16:02:00
278
原创 剑指Offer题解——随机刷题(一)
文章目录剑指 Offer 05. 替换空格解法剑指 Offer 13. 机器人的运动范围BFSDFS剑指 Offer 21. 调整数组顺序使奇数位于偶数前面双指针剑指 Offer 31. 栈的压入、弹出序列解法剑指 Offer 33. 二叉搜索树的后序遍历序列单调栈剑指 Offer 46. 把数字翻译成字符串动态规划推荐阅读剑指 Offer 05. 替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are
2020-08-13 15:58:06
353
原创 剑指Offer题解——递归和堆
文章目录递归剑指 Offer 10- I. 斐波那契数列迭代剑指 Offer 10- II. 青蛙跳台阶问题迭代剑指 Offer 16. 数值的整数次方快速幂堆排序剑指 Offer 41. 数据流中的中位数堆推荐阅读递归剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N -
2020-08-10 14:43:14
278
原创 剑指Offer题解——数学
文章目录剑指 Offer 17. 打印从1到最大的n位数回溯解法剑指 Offer 20. 表示数值的字符串解法剑指 Offer 43. 1~n整数中1出现的次数解法剑指 Offer 44. 数字序列中某一位的数字解法剑指 Offer 49. 丑数解法推荐阅读剑指 Offer 17. 打印从1到最大的n位数剑指 Offer 17. 打印从1到最大的n位数输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入:
2020-08-08 12:03:57
294
原创 剑指Offer题解——动态规划
文章目录剑指 Offer 12. 矩阵中的路径回溯剑指 Offer 14- I. 剪绳子动态规划剑指 Offer 14- II. 剪绳子 II动态规划剑指 Offer 19. 正则表达式匹配解法剑指 Offer 47. 礼物的最大价值动态规划剑指 Offer 63. 股票的最大利润动态规划推荐阅读剑指 Offer 12. 矩阵中的路径剑指 Offer 12. 矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、
2020-08-06 11:38:19
420
原创 剑指Offer题解——排序、回溯和分治
文章目录排序剑指 Offer 45. 把数组排成最小的数快速排序Arrays.sort回溯算法剑指 Offer 38. 字符串的排列回溯分治算法剑指 Offer 25. 合并两个排序的链表解法递归1递归2剑指 Offer 36. 二叉搜索树与双向链表解法剑指 Offer 40. 最小的k个数堆剑指 Offer 42. 连续子数组的最大和解法推荐阅读排序剑指 Offer 45. 把数组排成最小的数剑指 Offer 45. 把数组排成最小的数输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印
2020-08-03 13:05:23
284
原创 剑指offer题解——树(二)
文章目录剑指 Offer 34. 二叉树中和为某一值的路径解法剑指 Offer 37. 序列化二叉树解法剑指 Offer 54. 二叉搜索树的第k大节点递归剑指 Offer 55 - I. 二叉树的深度迭代解法递归解法剑指 Offer 55 - II. 平衡二叉树递归解法剑指 Offer 68 - I. 二叉搜索树的最近公共祖先递归剑指 Offer 68 - II. 二叉树的最近公共祖先递归推荐阅读剑指 Offer 34. 二叉树中和为某一值的路径剑指 Offer 34. 二叉树中和为某一值的路径输入
2020-07-31 13:25:22
303
原创 剑指Offer——树(一)
文章目录剑指 Offer 07. 重建二叉树递归迭代剑指 Offer 26. 树的子结构递归剑指 Offer 27. 二叉树的镜像递归解法剑指 Offer 28. 对称的二叉树递归解法迭代解法剑指 Offer 32 - I. 从上到下打印二叉树解法剑指 Offer 32 - II. 从上到下打印二叉树 II层序遍历剑指 Offer 32 - III. 从上到下打印二叉树 III层序遍历推荐阅读剑指 Offer 07. 重建二叉树剑指 Offer 07. 重建二叉树输入某二叉树的前序遍历和中序遍历的结果
2020-07-28 14:00:15
335
原创 剑指offer题解——位运算和哈希表
文章目录剑指 Offer 15. 二进制中1的个数解法剑指 Offer 39. 数组中出现次数超过一半的数字投票法剑指 Offer 48. 最长不含重复字符的子字符串滑动窗口剑指 Offer 50. 第一个只出现一次的字符hashmap推荐阅读剑指 Offer 15. 二进制中1的个数剑指 Offer 15. 二进制中1的个数请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例
2020-07-25 15:37:31
263
原创 剑指Offer题解——栈和队列
文章目录剑指 Offer 09. 用两个栈实现队列解法剑指 Offer 30. 包含min函数的栈解法剑指 Offer 59 - I. 滑动窗口的最大值双端队列剑指 Offer 59 - II. 队列的最大值解法剑指 Offer 11. 旋转数组的最小数字二分查找推荐阅读剑指 Offer 09. 用两个栈实现队列剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除
2020-07-23 15:41:17
312
原创 剑指Offer——字符串
文章目录剑指 Offer 58 - I. 翻转单词顺序解法剑指 Offer 58 - II. 左旋转字符串解法剑指 Offer 67. 把字符串转换成整数解法推荐阅读剑指 Offer 58 - I. 翻转单词顺序剑指 Offer 58 - I. 翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: "the sky is
2020-07-21 12:46:38
221
算法笔记和上机指南.胡凡(带详细书签) PDF 完整版 下载
2019-03-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人