- 博客(129)
- 资源 (1)
- 收藏
- 关注
原创 一致性哈希避免数据倾斜的方法--虚拟节点
其实之前没有理解虚拟节点的使用方法,它是可以动态上下线的,而且动态的上下线对其他节点产生均匀的影响,这样就能保证所有实体节点之间的数据和流量均衡。
2024-07-07 11:32:13
324
原创 ArrayList源码学习笔记(3)
时隔两年,重新读ArrayList源码,轻松了很多,以问题的方式记录一下收获。如果要想做到线程安全,需要对某个对象加锁的方式来实现,实现应当如下。
2023-12-24 20:07:00
759
原创 CopyOnWriteArrayList源码阅读-- java bug 6260652
简单的说,就是代码里用到的Collection.toArray方法返回的结果预期是Object[],但有Collection的子类在实现此方法的时候返回的结果并不是Object[]。这个类就是Arrays.ArrayList,其代码如下,它的toArray方法是使用的clone,返回的真实类型其实是E[]如果直接拿到这个数组使用,往里放入非E类型的其他Object,就会出现异常。jdk的bug都记录在了自己的数据库中,可以在网站上用bugid查询。可以直接看jdk bug网站上的介绍,
2023-07-02 22:35:30
412
原创 leetcode 第78题 子集
题目给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例1输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2输入:nums = [0]输出:[[],[0]]思路这个题最直观的方法就是用递归去实现。数组的每一个数字都可以选择是否拿取。还有一个比较巧妙的方法,就是用二进制来代表数组的每一个位置是否拿取。比
2021-11-21 11:23:06
431
原创 leetcode 第74题 搜索二维矩阵
题目编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例1输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3输出:true思路给的数组其实是整体有序的,行内升序,列内升序,行与行之间也是升序。其实一开始直接想到的就是先确定target是属于哪个行,也就是从第一列中查找target;然后在找到的行中,再
2021-10-23 17:20:01
192
原创 java异常对性能的影响
在java中,Exception一般被认为是比较影响性能的,因此不能作为常规代码使用,而是仅仅用于处理异常情况。那么,异常到底对程序的性能有多大的影响呢?找了一些中文资料,写的不是很严谨,这篇文章Performance Effects of Exceptions in Java的方法比较好一些,可以作为参考。从结论上看,一旦产生异常,整体耗时都会比正常程序高很多。所以,平常使用Exception要比较谨慎,只在处理异常情况的场景下使用,否则会影响性能。...
2021-10-11 14:30:40
1339
原创 leetcode 第72题 编辑距离
题目给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/edit-distance示例1输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse ->
2021-10-10 22:36:36
77
原创 java泛型声明
在java中,泛型的使用一般限于List和Map类,自己实现的很少。具体实现可以参考廖雪峰的文章。除此之外,还有一些问题记录一下。方法上的<T> 是什么含义 public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); }上面的代码是Arrays.copyOf方法,我们知
2021-10-09 14:25:07
1106
原创 java中的RandomAccess接口有什么用
在看ArrayList源码的时候发现它实现了RandomAccess接口,点进去一看是一个空接口。看了下注释,说这个接口是一个标志,用于给一些算法做提示,用来做一些性能优化。注释到底说了啥一堆英文,看的头大,找了一篇文章,解释的还不错,记录一下。有什么用途其实注释里已经提到了“给一些算法做提示”,用于算法性能优化。但是给哪些算法做了提示呢?举个例子说明,Collections是集合的一个工具类,里面实现的很多方法都用到了RandomAccess判断,如下二分搜索的代码:public static
2021-10-09 12:07:59
251
原创 leetcode 第69题 x的平方根
题目给你一个非负整数 x ,计算并返回 x 的 平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。示例1输入:x = 4输出:2示例2输入:x = 8输出:2解释:8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。思路这个题最显的思路就是二分法。找到平方值小于等于x的最大数字。二分法的解题关键在于:(1)需要考虑数字溢出问题(2)需
2021-09-25 18:22:46
126
原创 leetcode 第65题 有效数字
题目有效数字(按顺序)可以分成以下几个部分:一个 小数 或者 整数(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数小数(按顺序)可以分成以下几个部分:(可选)一个符号字符(’+’ 或 ‘-’)下述格式之一:至少一位数字,后面跟着一个点 ‘.’至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字一个点 ‘.’ ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:(可选)一个符号字符(’+’ 或 ‘-’)至少一位数字部分有效数字列举如下:[“
2021-09-11 16:14:34
142
原创 leetcode 第62/63题 不同路径
题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例1输入:m = 3, n = 7输出:28思路这个题是明显的动态规划题目。令f(i,j)为机器人到达(i,j)处的不同路径数,可以发现f(i,j)=f(i-1,j)+f(i,j-1),i>0,j>0很显然我们可以给出一个时间复杂度 O(nm) 并且空
2021-08-21 17:27:51
78
原创 leetdoce第61题 旋转链表
题目给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]思路这个题其实用双指针很简单;复杂点在于k有可能会大于链表的长度。双指针的思路是:快指针先到达第k+1个节点,然后满指针指向head,两个指针同时前进直到快指针到达链表尾部。此时的满指针的next节点就是新的链表头、快指针指向原来的head即可。在k大于链表长度的情况下,计算出(k = k mod list_lengt
2021-08-21 15:30:45
126
原创 leetcode 第60题 排列序列(康拓展开)
题目给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。示例 1:输入:n = 3, k = 3输出:“213”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutation-sequence思路这个题思考了半天还是没有理清楚最
2021-08-14 19:53:06
146
原创 leetcode 第59题 螺旋矩阵 II
题目给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例1输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]思路这个题思路还是比较清晰的,就把螺旋填充的过程看成是分层的过程,一层层深入。深入的过程中跟踪层数的方法有两种,一种是直接记录层数,一种是记录每一层的边界。方法一class Solution { public int[][] generateMatrix(int n)
2021-08-01 11:14:48
201
原创 leetcode 第58题 最后一个单词的长度
题目给你一个字符串 s,由若干单词组成,单词之间用单个或多个连续的空格字符隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例1输入:s = “Hello World”输出:5示例2输入:s = " "输出:0思路这个题其实很简单,就是从后往前遍历字符串的每个字符就可以。但是相同的思路落实到代码上还是会有比较大的差异。下面写一下几个版本代码的差异代码第一版代码class Solution
2021-08-01 09:58:59
93
原创 leetcode 第57题 插入区间
题目给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例1输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]示例2输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]输出:[[1,2],[3,10],[12,16]]
2021-07-24 12:13:30
132
原创 到底什么是带宽、网速、延迟
菜鸟自述一直以来,都感觉没弄明白带宽和网速的概念,而且容易和网络延迟产生混淆。困惑1、带宽和网速到底是啥概念,为什么大家都把带宽形容为马路,马路越宽运输速度越快?网线是马路?困惑2、网速越高,延迟越低吗?速度快,所以延迟低,好像有道理,但又有点不太对。解惑光信号、电信号首先,电脑上的数据都是电信号,网络上传输的都是光信号,光信号和电信号通过调制解调器进行互相转换。电信号是0和1,转化成光信号怎么表示呢?其实是通过频率来表示,比如高频代表1、低频代表0(推测是这样,估计更复杂)光信号是光速
2021-07-23 21:17:11
2649
2
原创 leetcode 第55题 跳跃游戏
题目给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个
2021-07-10 10:02:53
312
原创 java的 wait notify sleep LockSupport.park 到底怎么区分
前言之前对这些方法一直是云里雾里,最近正好看到相关的东西,赶紧重新整理一波。wait这是Object的方法,不允许重写。总结一下它的特点:带参数的是等待一定时间,不带参数的是无限等待a.wait() 的时候,当前线程一定是持有了a的锁,否则会报错;所以a.wait方法一般是在synchronized(a){}内部执行的(也可以是用其他方式获得锁)所以,就有了一个有趣的问题:notify()会立刻释放锁么?a.wait()的时候,当前线程会释放a的锁,让出cpu执行时间。但是当前线程持有的其他
2021-07-06 17:02:23
170
原创 ThreadPoolExecutor 是怎么控制非核心线程超时的
前言java的线程池最根本的都是使用的ThreadPoolExecutor,其构造方法的参数、线程增长顺序、拒绝策略经常在面试中被问到。但是有一个不常见的问题:keepAliveTime是怎么生效的?非核心线程是怎么超时退出的呢?其实这个问题在我们真正看完ThreadPoolExecutor的源码和逻辑之后,其实是很容易说清楚的。先说结论:在线程池里的线程会一个死循环里阻塞式地从队列里获取任务来执行,而当线程数超过核心线程数的时候,这里的阻塞时间是keepAliveTime,超过这个时间没有获取到任务
2021-07-06 16:01:36
1003
原创 HashMap非线程安全的表现
前言我们都知道HashMap是线程不安全的,但是具体有哪些表现呢?例子1 死循环这个是最常在面试中问到的问题,然而其实这个问题已经在java1.8版本被修复了,只在1.7版本之前存在这个问题。大致原因是在HashMap扩容的时候链表采用了头插法会使链表反序,两个线程同时扩容的话,在某种场景下会出现循环链表导致死循环。网上有很多文章介绍,有一篇写的很好,不再重复java1.8修复的方法是将头插法改成了尾插法,避免了这个死循环问题。参考文章,也可以看一下resize的代码,很容易理解。那么java1
2021-07-04 17:28:33
1091
2
原创 leetcode 第53题 最大子序和
题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6思路这个题其实有一个简单的思路,从前往后一直累加,如果当前累加和为负数,抛弃这个数,因为这个数对于后续的求和是拖后腿的。只有在正向情况下一直累加。在这个过程中可以一直记录累加的最大值。看了官方动态规划的思路,感觉很好,记录一下 链接,很值得学习一下,
2021-07-04 09:30:41
66
原创 什么是线程安全
文章目录前言为什么说不出来到底什么是线程安全继续分析参考文章前言线程安全的概念其实大家都知道,但是如果细问却总觉得缺点系统性。一次面试的时候被问到“什么是线程安全”,瞬间有点懵逼,不知道从哪里开始说起。其实是对线程安全的认知还是不够透彻。最近,在看HashMap线程安全问题的时候,又重新思考了一遍,有一些感悟记录一下。下面记录的是了解过程,其实中间未必有用,最终结论其实是:线程安全是因为有竞态条件,导致竞态条件发生的代码区叫做临界区,对临界区内增加同步逻辑可以避免竞态条件以达到线程安全。可以直接看
2021-07-02 14:01:52
79
原创 leetcode 第51题 N皇后问题
题目n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例1输入:n = 4输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]解释:如上图所示,4 皇后问题存在两个不同的解法。示例2输入:n = 1输出:[[“Q
2021-06-26 11:45:22
261
原创 leetcode 第48题 旋转图像
题目给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例2输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5
2021-06-12 18:15:24
103
原创 Hystrix & Rxjava
文章目录前言一些文章前言项目中看到Hystrix和Rxjava的使用,了解了一下这两个东西的使用,简单记录一下资料。Hystrix是用来做熔断和限流的框架,现在已经不维护了,里面的实现用到了很多Rxjava的东西。Rxjava是反应式编程的一个工具包,在安卓中很常用。一些文章项目里只用到了Hystrix的降级功能,没有用到熔断;降级逻辑是通过继承HystrixCommand并实现getFallback方法来做到的。在排查问题的时候发现触发了降级逻辑,但是不知道是什么异常导致的,于是找到一篇文
2021-06-10 15:32:09
285
原创 leetcode 第46题 全排列
目录题目思路代码复杂度耗时扩展题目给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2输入:nums = [0,1]输出:[[0,1],[1,0]]示例3输入:nums = [1]输出:[[1]]思路有一堆数字,找它的全排列,就是把所有的数字都用上,依次获取数字。第一个数字选择
2021-05-29 10:03:20
271
原创 leetcode 207 210 - 课程表 - 环形检测、拓扑排序
题目两个题非常相似,只记录210题现在你总共有 n 门课需要选,记为0到n-1。在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。示例1:输入: 2, [[1,0]]输出: [0,1]解释:总共有 2 门课程。要学习课程 1,你需...
2021-05-22 14:20:46
119
原创 IDEA debug工具的使用
背景 一直以来,在IDEA上使用debug工具都只会单步调试,连调试的时候使用表达式都是看同事操作才刚学会。对于java程序员来说,对于IDEA的使用度如此浅薄实在是说不过去。 最近看了一篇文章,写的简直太好了,对于每个功能都有详细介绍和动图示例。收获颇多,记录一下。问答记录 由于文章中已经有很详细的介绍了,且读的过程非常顺畅,不需要重新写一篇文章,所以通过问答的方式记录一下收获。(1)最主要的收获是什么最主要的收获有:a、知道了有四种断...
2021-05-08 10:52:29
469
原创 代理模式到底是什么?
背景 对面向对象的设计模式一直不是很熟悉,看spring的aop原理的时候,说道它是代理模式实现的。决定先看一下简单的设计模式demo。但是网上写的这些例子真的是让人失望,甚至有的书也是错的。。代理模式概述 简单的说,代理模式就是用户直接使用代理类,不需要知道具体实现。而代理类提供者的意图是要通过代理类控制使用方的行为。 至于动态代理模式,解决的问题就更多了,可以让实现类的变动不需要代理类进行变动。静态代理模式demo 网上好多例子的实现都写成了装饰器模式,代...
2021-04-29 11:44:13
293
原创 leetcode 第45题 跳跃游戏Ⅱ
题目给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳1步,然后跳3步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。来源:力扣(LeetCode)链接:https://leetcode-cn.com/...
2021-04-24 16:45:30
123
原创 leetcode 第44题 通配符匹配
题目给定一个字符串(s) 和一个字符模式(p) ,实现一个支持'?'和'*'的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s可能为空,且只包含从a-z的小写字母。p可能为空,且只包含从a-z的小写字母,以及字符?和*。示例1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例2:输入:s = "...
2021-04-18 14:24:05
1575
原创 Thrift初探
用Q&A的方式记录一下对Thrift的初步认知Q:Thrift是什么A:Thrift是一个rpc框架,而且具有跨语言能力。有时候很容易把它和Protobuffer、avro进行比较,但他们的能力范围是不一样的。protobuffer和avro是一种数据描述语言,提供数据的序列化和反序列化能力。Thrift也提供了这种能力。除此之外,Thrift还提供了完整的rpc框架,用户使用Thrift可以在不同的服务之间进行通信。Q:Thrift是怎样使不同服务之间通信的?A..
2021-04-14 10:41:40
276
1
原创 leetcode 第43题 字符串相乘
题目给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例2:输入: num1 = "123", num2 = "456"输出: "56088"说明:num1和num2的长度小于110。num1 和num2 只包含数字0-9。num1 和num2均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数...
2021-04-11 10:39:22
83
原创 leetcode 第41题 缺失的第一个正数
题目给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?示例 1:输入:nums = [1,2,0]输出:3示例 2:输入:nums = [3,4,-1,1]输出:2示例 3:输入:nums = [7,8,9,11,12]输出:1提示:0 <= nums.length <= 300-231 <= nums[i] <= 23...
2021-03-28 11:13:35
201
原创 leetcode 第40题 组合总和 II
题目给定一个数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例1:输入: candidates =[10,1,2,7,6,1,5], target =8,所求解集为:[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6]]示...
2021-03-21 14:23:22
93
原创 jvm方法调用指令
背景 之前看jvm指令的时候,看到各种invokexxx指令,没区分清楚到底什么区别,正好看《深入分析java web技术内幕》这本书,里面也讲到了这部分,正好回顾并整理一下。5种方法调用指令 一共有5种方法调用指令。invokestatic:调用静态方法invokespecial:调用<init>方法、private方法、super方法invokevirtual:调用虚方法invokeinterface:调用接口方法invokedynami...
2021-03-10 10:22:06
151
原创 leetcode 第37题 解数独
题目编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。空白格用'.'表示。一个数独。答案被标成红色。提示:给定的数独序列只包含数字1-9和字符'.'。你可以假设给定的数独只有唯一解。给定数独永远是9x9形式的。来源:力扣(LeetCode)链接:https://leetcode-c...
2021-03-07 20:38:55
173
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人