自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(125)
  • 收藏
  • 关注

原创 Feign异步调用丢失请求头问题

在远程调用时,经常会采用异步化编排,但是在远程调用时,会出现一些问题。:由于 RequestContextHolder底层使用的是线程共享数据 ThreadLocal,我们知道线程共享数据的域是 当前线程下,线程之间是不共享的。所以在开启异步时获取不到老请求的信息,自然也就无法共享cookie了。:向 RequestContextHolder 线程域中放主线程的域。

2022-05-31 23:28:42 797 2

原创 OpenFeign远程调用丢失请求头问题

Feign远程调用的时候会丢失请求头加上feign远程调用的请求拦截器。(RequestInterceptor)因为feign在远程调用之前会执行所有的RequestInterceptor拦截器,所以我们添加一个拦截器,让feign发请求时,带上之前老请求的cookie就可以了。

2022-05-31 23:25:49 970

原创 RabbitMQ 实战教程【自学笔记】

RabbitMQ 实战教程1.MQ引言1.1 什么是MQMQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。1.2 MQ有哪些当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、

2022-05-30 22:37:15 645

原创 【leetcode】剑指 Offer 10- II. 青蛙跳台阶问题

题目描述题目连接剑指 Offer 10- II. 青蛙跳台阶问题题解此题跟斐波那契数列一样,利用动态规划的思想。dp[n]的意义,上第n级台阶有多少种方法设置初值dp[0] = 1, dp[1] = 1递推公式:因为一次能上一级台阶或者两级台阶。所以dp[n] = dp[n - 1] + dp[n - 2]因为dp[n]只与前两个数字有关,可以进行空间优化class Solution { public int numWays(int n) { if (n &lt

2021-12-28 14:14:25 235

原创 【leetcode】剑指 Offer 04. 二维数组中的查找

题目描述题目连接剑指 Offer 04. 二维数组中的查找题解仔细观察矩阵规律。我们可以从左上角开始对比。从左上角开始对比,cur如果target比当前值大,cur下移如果target比当前值小,cur左移越过边界则返回falseclass Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix.length == 0) return false

2021-12-28 14:08:31 3094

原创 【leetcode】剑指 Offer 03. 数组中重复的数字

题目描述题目连接剑指 Offer 03. 数组中重复的数字题解归位法,长度为n,并且所有数字都是在0到n-1之间。长度为n,并且所有数字都是在0到n-1之间。我们把所有的的数字进行归位。比如当nums[i] == 1的时候,我们把它放在第1个位置,当nums[i] == 2的时候,我们把它放在第2个位置…详见代码注释。class Solution { public int findRepeatNumber(int[] nums) { //遍历nums中每个数字

2021-12-28 14:00:25 3089

原创 【leetcode】剑指 Offer 09. 用两个栈实现队列

题目描述题目连接剑指 Offer 09. 用两个栈实现队列题解队列是先进先出的。栈是先进后出的,也就是说可以用栈实现反序。那么我们就可以用两个栈,实现两次反序,就变成先进先出的了。创建两个栈,s1负责入栈,s2负责出栈入栈时,直接加入s1栈顶出栈时,如果s2不为空的话,直接输出s2栈顶。如果s2为空的话,把s1中的元素都加入到s2之中,再输出。class CQueue { Deque<Integer> s1; Deque<Integer> s2;

2021-12-28 13:47:38 87

原创 【leetcode】剑指 Offer 10- I. 斐波那契数列

题目描述题目连接:剑指 Offer 10- I. 斐波那契数列题解:动态规划思想初值:f0 = 0, f1 = 1递推公式:f (n) = f (n - 1) + f (n - 2)由于f (n)只和前两个有关,所以可以利用三个变量来进行空间优化class Solution { public int fib(int n) { if (n <= 1) return n; int a = 0, b = 1, c = 0; for

2021-12-28 13:35:39 270

原创 反射机制的原理和使用

什么是反射?通过反射可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性。通过反射可以实现,在只修改配置文件而不修改源码的情况下,来控制程序。简单来说,就是将类的各个部分封装成其他对象。反射机制:加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象包含了类的完整结构信息,我们通过这个对象得到类的结构。反射相关的主要类:java.lang.Class: 代表一个类,Class对象表示某个类加载后在堆中的对象java.lang.reflect.M

2021-12-07 15:54:48 902

原创 ThreadLocal到底是什么?是如何实现的?

ThreadLocal是什么?ThreadLocal可以给每一个线程分配属于自己的本地变量,让每个线程绑定自己的值,线程之间不互相影响。ThreadLocal的使用:创建了ThreadLocal变量之后,可以使用get()和set()方法来获取默认值,或者更改当前线程所保存的副本的值。举例:public class ThreadLocalDemo { static ThreadLocal<Integer> threadLocal = new ThreadLocal<&g

2021-12-07 03:01:23 384

原创 【设计模式】代理模式

代理模式:为一个对象提供一个替身,以控制对这个对象的访问,通过代理对象访问目标对象,可以在不修改目标对象的前提下,给目标对象增强额外的功能。静态代理、动态代理、Cglib代理静态代理:需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者继承相同的父类,然后调用相同的方法来调用目标对象的方法代码实现://代理对象和被代理对象必须实现同一接口ITeacherDaopublic interface ITeacherDao { void teach();}--------

2021-12-05 23:18:16 441

原创 【设计模式】单例模式

目的:单例设计模式,保证整个的软件系统中,对某个类只能存在一个对象实例,并且该类提供一个取得其对象实例的方法。饿汉式:优点:实现方便,在类装载的过程中就完成了实例化。缺点:饿汉式加载可能会造成内存的浪费public class Singleton { //私有化构造器,让外部不能new private Singleton() { } //构造一个唯一实例 private final static Singleton instance = new

2021-12-05 22:01:39 436

原创 第十三章、 GC分类与性能指标

第十章、垃圾回收概述及算法13.1. GC分类与性能指标13.1.1. 垃圾回收器概述13.1.2. 垃圾收集器分类13.1.3. 评估GC的性能指标吞吐量暂停时间吞吐量 vs 暂停时间13.2. 不同的垃圾回收器概述13.2.1. 垃圾回收器发展史13.2.2. 7种经典的垃圾收集器13.2.3. 7款经典收集器与垃圾分代之间的关系13.2.4. 垃圾收集器的组合关系13.2.5. 不同的垃圾收集器概述13.2.6. 如何查看默认垃圾收集器13.3. Serial回收器:串行回收13.4. ParNew回

2021-11-22 15:30:59 774

原创 第十二章、垃圾回收相关概念

第十二章、垃圾回收相关概念12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leak)12.3. Stop The World12.4. 垃圾回收的并行与并发并发(Concurrent)并行(Parallel)并发 vs 并行垃圾回收的并发与并行并行(Parallel)串行(Serial)并发(Concurrent)12.5. 安全点与安全区域安全点抢先式中断:(目前没有虚拟机采用了)主动式中断安全区域(Safe Resion)实际执行时:12.

2021-11-22 14:00:40 653

原创 第十一章、垃圾回收概述及算法

第十一章、垃圾回收概述及算法11、垃圾回收概述及算法11.1. 垃圾回收概述11.1.1. 什么是垃圾?11.1.2. 为什么需要GC11.1.3. 早期垃圾回收11.1.4. Java垃圾回收机制担忧GC主要关注的区域11.2. 垃圾回收相关算法11.2.1. 标记阶段:引用计数算法11.2.2. 标记阶段:可达性分析算法11.2.3. 对象的finalization机制11.2.4. MAT与JProfiler的GC Roots溯源11.2.5. 如何判断什么原因造成OOM11.2.6. 清除阶段:标

2021-11-17 19:21:33 132

原创 【leetcode】122. 买卖股票的时机 II(Java)

题目描述题目连接122. 买卖股票的最佳时机 II题解贪心,动态规划1、贪心只要今天的价格比昨天的高,那我就赚钱了!class Solution { public int maxProfit(int[] prices) { int res = 0; for (int i = 1; i < prices.length; i++){ if (prices[i] - prices[i - 1] > 0){

2021-11-15 20:48:31 260

原创 【leetcode】24. 两两交换链表中的节点(Java)

题目描述题目连接24. 两两交换链表中的节点题解链表题舍得用指针就好首先建个哑节点res。 res.next = head;要交换两个相邻节点,需要保存3个指针,1、前驱节点pre;2、第一个要交换的节点slow; 3、第二个要交换的节点fast。交换过程如下: pre.next = fast; slow.next = fast.next; fast.next = slow;更新pre,交换下一组详见代码注释class Sol

2021-11-15 20:37:19 588

原创 【leetcode】169. 多数元素(Java)

题目描述题目连接169. 多数元素题解摩尔投票法:class Solution { public int majorityElement(int[] nums) { int res = nums[0]; int count = 1; for (int i = 1; i < nums.length; i++){ if (nums[i] == res){ count++;

2021-11-15 20:20:14 75

原创 【leetcode】剑指 Offer 40. 最小的k个数(Java)

题目描述题目连接剑指 Offer 40. 最小的k个数题解快速排序:我们知道快速排序的每一轮,都是找到一个数应该在的位置,左边都是比他小的,右边都是比他大的。所以我们进行快排,当当前坐标等于k - 1的时候,左边的数组就是前k小的数class Solution { public int[] getLeastNumbers(int[] arr, int k) { return quick(arr, k, 0, arr.length - 1); } publ

2021-11-15 20:18:21 438

原创 第十章、StringTable

第十章、StringTable10、StringTable10.1. String的基本特性10.1.1. String在jdk9中存储结构变更10.1.2. String的基本特性10.2. String的内存分配10.3. String的基本操作10.4. 字符串拼接操作10.5. intern()的使用10.5.1. intern的使用:JDK6 vs JDK7/810.5.2. intern的效率测试:空间角度10.6. StringTable的垃圾回收10.7. G1中的String去重操作笔

2021-11-15 15:04:21 264

原创 第九章、执行引擎

第九章、执行引擎9. 执行引擎9.1. 执行引擎概述9.1.1. 执行引擎的工作流程9.2. Java代码编译和执行过程9.2.1. 什么是解释器(Interpreter)?什么是JIT编译器?9.2.2. 为什么Java是半编译半解释型语言?9.3. 机器码、指令、汇编语言9.3.1. 机器码9.3.2. 指令9.3.3. 指令集9.3.4. 汇编语言9.3.5. 高级语言C、C++源程序执行过程9.3.6. 字节码9.4. 解释器9.4.1. 解释器工作机制9.4.2. 解释器分类9.4.3. 现状9.

2021-11-15 14:35:19 136

原创 第八章、对象实例化及直接内存

第八章、对象实例化及直接内存8、对象实例化及直接内存8.1. 对象实例化8.1.1. 创建对象的方式8.1.2. 创建对象的步骤1. 判断对象对应的类是否加载、链接、初始化2. 为对象分配内存3. 处理并发问题4. 初始化分配到的内存5. 设置对象的对象头6. 执行init方法进行初始化8.2. 对象内存布局8.2.1. 对象头8.2.2. 实例数据8.2.3. 对齐填充8.3. 对象的访问定位8.3.1. 句柄访问8.3.2. 直接指针(HotSpot采用)8.4. 直接内存(Direct Memory)

2021-11-15 14:12:30 101

原创 【leetcode】72. 编辑距离(Java)

题目描述题目连接72. 编辑距离题解经典dp:dp数组定义:dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。初始化:dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2的最近编辑距离为dp[i][0]。所以直接初始化为非空串的长度即可for (int i = 1; i <= c1.length; i++){ dp[i][0] = i; } for

2021-11-12 20:54:19 253

原创 【leetcode】剑指 Offer 54. 二叉搜索树的第k大节点(Java)

题目描述题目连接剑指 Offer 54. 二叉搜索树的第k大节点题解中序遍历:二叉搜索树中序遍历是从小到大。先遍历右子树,再遍历左子树,就变成从大到小了。用target计数,target等于0时,就是我们要找的第K大节点class Solution { int res = 0; int target = 0; public int kthLargest(TreeNode root, int k) { target = k; dfs(root

2021-11-12 19:50:30 349

原创 【leetcode】226. 翻转二叉树(Java)

题目描述题目连接226. 翻转二叉树题解后序遍历:后序遍历,交换左右子树即可class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) return root; TreeNode left = invertTree(root.left); TreeNode right = invertTree(root.right); root

2021-11-11 19:55:23 531

原创 【leetcode】剑指 Offer 36. 二叉搜索树与双向链表(Java)

题目描述题目链接剑指 Offer 36. 二叉搜索树与双向链表题解中序遍历:pre记录前一个节点,cur记录当前节点当pre != null 时, pre.right = cur , cur.left = pre我们还需要记录头节点和尾节点,把链表变成循环链表当pre == null的时候,当前cur就是头节点当遍历结束时, pre所指向的就是最后一个节点,直接连接就可以,详见代码注释class Solution { Node cur = null; Node pre

2021-11-11 19:52:38 599

原创 【leetcode】83. 删除排序链表中的重复元素(Java)

题目描述题目链接83. 删除排序链表中的重复元素题解cur记录当前节点,tmp往下找到第一个不等于cur.val的节点。直接cur.next = tmp,就把中间相同的都删除掉了class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) return head; ListNode cur = head, tmp = head; whi

2021-11-11 19:46:04 232

原创 【leetcode】48. 旋转图像(Java)

题目描述题目链接48. 旋转图像题解先上下旋转,再按照对角线旋转class Solution { public void rotate(int[][] matrix) { //上下旋转 //7 8 9 //4 5 6 //1 2 3 for (int i = 0; i < matrix.length / 2; i++){ for (int j = 0; j < matrix[0].length; j

2021-11-11 19:41:57 394

原创 【leetcode】138. 复制带随机指针的链表(Java)

题目描述题目链接138. 复制带随机指针的链表题解哈希表:key是原始节点,value是复制的节点。思路挺简单的,直接看代码就能理解了class Solution { public Node copyRandomList(Node head) { Map<Node, Node> map = new HashMap<>(); Node cur = head; while (cur != null){

2021-11-10 21:21:41 70

原创 【leetcode】221. 最大正方形(Java)

题目描述题目链接221. 最大正方形题解动态规划:dp数组的含义:以当前节点为右下角的正方形的 边长递推公式:dp[i][j] = min(左边、上边、左上方)+ 1dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;完整代码:class Solution { public int maximalSquare(char[][] matrix) { int

2021-11-10 21:18:04 280

原创 【leetcode】958. 二叉树的完全性检验(Java)

题目描述题目链接958. 二叉树的完全性检验题解层次遍历:层次遍历,空值也入队,当出队值为空时判断队列剩下元素是否都为空,为则完全二叉树class Solution { public boolean isCompleteTree(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isE

2021-11-10 21:12:53 259

原创 第七章、方法区

第七章、方法区7、方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里?7.2.2. 方法区的基本理解7.2.3. HotSpot中方法区的演进7.3. 设置方法区大小与OOM7.3.1. 设置方法区内存的大小7.3.2. 如何解决这些OOM7.4. 方法区的内部结构7.4.1. 方法区存储什么?7.4.2. 方法区的内部结构7.4.3. 运行时常量池 VS 常量池7.4.4. 运行时常量池7.5. 方法区使用举例7.6. 方法区的演进细节7.6.1. 为什么永久代要被元

2021-11-10 18:58:50 106

原创 【leetcode】22. 括号生成(Java)

题目描述题目链接22. 括号生成题解回溯:用left, right分别记录左括号和右括号的数量终止条件:path.length() == n * 2 && left == n && right == n的时候,满足条件,保存结果( path记录当前的路径)right > left || left > n || right > n 此时括号是无效的,直接return处理逻辑:左子树递归: path后面加一个’(’,left + 1

2021-11-10 00:17:34 154

原创 【leetcode】129. 求根节点到叶节点数字之和(Java)

题目描述题目链接129. 求根节点到叶节点数字之和题解递归:终止条件:当遇到叶子节点的时候,返回当前路径组合的值当遇到空节点的时候,返回0( 一定要返回0)处理逻辑:用target记录从根节点到当前节点的值,并作为参数传入下一个递归函数如果不为空的话,target = target * 10 + root.valclass Solution { public int sumNumbers(TreeNode root) { return dfs(ro

2021-11-10 00:06:45 101

原创 【leetcode】104. 二叉树的最大深度(Java)

题目描述题目链接104. 二叉树的最大深度题解递归:终止条件:root == null return 0处理逻辑:递归处理左子树右子树,返回其中大的,并且 +1。class Solution { public int maxDepth(TreeNode root) { return getDepth(root); } public int getDepth(TreeNode root){ if (root == null) retur

2021-11-10 00:00:09 380

原创 【leetcode】70. 爬楼梯(Java)

题目描述题目链接70. 爬楼梯题解动态规划:dp[i]含义:上第i层楼梯,有几种方法递推公式:上第i层楼梯,可以从i - 1,上1层,或者从i - 2,上2层。所以递推公式:dp[i] = dp[i - 1] + dp[i - 2]class Solution { public int climbStairs(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1;

2021-11-09 23:56:07 64

原创 【leetcode】110. 平衡二叉树(Java)

题目描述题目链接110. 平衡二叉树题解自顶向下(暴力):求左子树的深度,右子树的深度,两个深度相减,如果绝对值小于1,递归判断左子树,右子树class Solution { public boolean isBalanced(TreeNode root) { if (root == null) return true; int left = getDepth(root.left); int right = getDepth(root.

2021-11-05 20:34:14 79

原创 【leetcode】101. 对称二叉树(Java)

题目描述题目链接101. 对称二叉树题解递归迭代都要会。递归:看根节点的左右子树是否对称,与根节点无关。递归终止条件:left == null && right == null处理逻辑: 注意我们要做的不是验证二叉树的左右子树是否相等! 而是是否镜像对称!所以我们递归的参数应该是check(left.left, right.right) && check(left.right, right.left)class Solution { public

2021-11-05 20:09:43 109

原创 第六章、堆

第六章、堆6、堆6.1. 堆(Heap)的核心概述6.1.1. 堆内存细分6.1.2. 堆空间内部结构(JDK7)6.1.3. 堆空间内部结构(JDK8)6.2. 设置堆内存大小与OOM6.2.1. 堆空间大小的设置6.2.2. OutOfMemory举例6.3. 年轻代与老年代6.4. 图解对象分配过程6.4.1. 概念6.4.2. 图解过程6.4.3. 思考:幸存区区满了后?6.4.4. 对象分配的特殊情况6.4.5. 总结6.5. Minor GC,MajorGC、Full GC6.5.1. 年轻代G

2021-11-04 14:27:36 88

原创 第五章、本地方法接口和本地方法栈

第五章、本地方法接口和本地方法栈5、本地方法接口和本地方法栈5.1. 什么是本地方法?5.2. 为什么使用Native Method?5.2. 本地方法栈笔记根据网课:尚硅谷宋红康JVM全套教程(详解java虚拟机)整理5、本地方法接口和本地方法栈5.1. 什么是本地方法?​ 简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言

2021-11-04 14:20:10 86

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除