- 博客(79)
- 收藏
- 关注
原创 个人学习易忘点汇总
JavaReadWriteLock也支持公平与非公平模式(ReentrantReadWriteLock)。但是有一点需要注意,那就是只有写锁支持条件变量,读锁是不支持条件变量的,读锁调用 newCondition() 会抛出 UnsupportedOperationException 异常。 JDK8引入的StampedLock,相比ReadWriteLock,模式有写锁、悲观读、乐观读,其中乐观度是无锁的。首先通过调用 tryOptimisticRead() 获取了一个 stamp,读完后在通过调用
2021-06-30 17:25:27 757 1
原创 Class.forName与classLoader.loadClass 区别 及 打破双亲委派加载机制的方法
文章开始,先把问题抛出来吧,这样看的时候心中就一直会有这样的疑问:通过Class.forName与通过classLoader.loadClass 获取到Class有什么区别?Class.forName与classLoader.loadClass 区别话不多说,线上代码测验一下。Test对象类:package reflect;public class Test { ...
2019-12-03 15:18:34 537
原创 Java之AQS代码原理解析
AQS(AbstractQueuedSynchronizer)是各种锁实现的基础,提供了对资源(state字段)的获取与阻塞等待,阻塞的线程会被放进一个先进先出(FIFO)的同步队列里。各种锁是AQS的子类,子类必须实现一套用来改变state变量(volatile 修饰的变量)的方法,包括锁资源的获取方法与锁资源的释放方法。始终记得:volitile和cas操作铸就了AQS的辉煌。...
2019-09-26 20:34:15 591
原创 Rabbit+SpringBoot 指定自动生成exchange、routingkey和Queue对应关系
使用AmqpTemplate只能指定对列名发送,并不会存在对应exchange关系,此时只能单配置一个,还要必须从上下文配置文件指明。经过研究发现通过使用RabbitTemplate可以自动生成exchange和routingkey之间的关系,而不用去RabbitMQ的management页面操作。具体如下: pom.xml依赖配置:<!--消息队列模块-->...
2018-08-28 15:08:13 14384
原创 Executors与ThreadPoolExecutor(阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建)
最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险Executors利用工厂模式向我们提供了4种线程池实现方式,但是并不推荐使用,原因是使用Executors创建线程池不会传入这个参数而使用默认值所以我们常常忽略这一参数,而且默认使用的参
2017-10-30 16:14:20 25656 2
原创 【算法题】单次搜索(给定一个二维网格和一个单词,找出该单词是否存在于网格中)
从二维数组中找字符串是否存在,而且同一个元素不能重复使用。这是字符串匹配类型题目,要记住方法。将二维数组简化成字符串,也就是字符串匹配了(依次遍历每个元素,将其当做开头,开始匹配)。4、从二维数组哪个字符开始匹配呢?遍历二维数组,依次将字符当做第一个字符跟字符串开始匹配。3、其实就是一个字符一个字符地匹配,当前字符相同,则向四周匹配。2、不能重复使用,想到用一个数组来标记每个元素的使用情况。1、可以想到的是使用回溯法。
2024-09-06 19:23:20 205
原创 【算法题】找出数组中重复的数字
若发现下标为 nums[i] - 1nums[i]−1 的数字已经是负数,说明之前出现过同样的数字 nums[i]nums[i],即找到了重复数字;从起始位置进行遍历,每次将下标为 nums[i] - 1nums[i]−1 的数字取反;当遍历到值 nums[i]nums[i] 为负数,需要忽略其负号。需要注意的是,题目中已经声明数字最多出现两次,所以这个方法可行。原地修改数组——取反。
2024-08-28 15:26:49 184
原创 【算法题】找到任意一个峰值数字 要求时间复杂度为logn
在数组中找到一个峰值数字,其中峰值定义为比其相邻元素大的元素,可以使用二分查找算法来实现时间复杂度为O(log n)。以下是一个Java示例,演示如何在一个整数数组中找到任意一个峰值数字:。
2024-08-27 18:36:48 137
原创 【算法题】最长无重复子串 的长度
在Java中,解决“最长无重复子串”的问题是一个常见的算法题。这个问题可以通过滑动窗口的方式来解决,具体步骤如下:。以下是一个Java实现的示例代码:。
2024-08-27 16:53:06 190
原创 【算法题】最长递增子序列
Explanation: 最长自增子序列是[2,3,7,18,19],长度为5。Explanation: 最长自增子序列是[2,3,7,101],长度为4。给定长度为N的数组,返回最长自增子序列的长度。
2024-08-27 14:53:20 226
原创 【算法题】给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字
给定一个排序链表,节点值均为正数,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
2024-08-19 15:34:52 83 1
原创 类图——个人自学
类图定义许多(静态)说明性的模型元素(类、接口、关系)相互连接组成的图。类图作用描述系统的构成方式,而不是系统是如何协作运行,这有利于让我们在正确编写代码之前对系统有一个全面的认识。类图核心知识类(Class):一类或者一组具体类似属性和共同行为的事物。实例:...
2022-04-06 15:07:38 952
原创 【算法题】单链表快速排序
Java实现单链表的快速排序和归并排序 - morethink - 博客园在一般实现的快速排序中,我们通过首尾指针来对元素进行切分,下面采用快排的另一种方法来对元素进行切分。我们只需要两个指针p1和p2,这两个指针均往next方向移动,移动的过程中保持p1之前的key都小于选定的key,p1和p2之间的key都大于选定的key,那么当p2走到末尾时交换p1与key值便完成了一次切分。图示如下:public class Test23 { public static void mai
2022-03-08 22:36:33 473
原创 【算法题】打印二叉树中和为某一值的所有路径
public class Test17 { //打印二叉树中和为某一个值的所有路径 public static ArrayList<ArrayList<Integer>> pathList = new ArrayList<>(); public static ArrayList<Integer> path = new ArrayList<>(); public static ArrayList<Array.
2022-02-17 16:57:27 313
原创 【算法题】二叉树节点有指向parent父节点的指针,返回输入节点在这个树中序遍历序列里下一个节点
public class Test21 { //二叉树,left right parent父节点指针 //返回输入节点在这个树中序遍历序列里下一个节点 static class TreeNode { int val; TreeNode parent, left, right; public TreeNode(int val, TreeNode parent, TreeNode left, TreeNode right) { .
2022-02-17 16:46:14 671
原创 【算法题】二叉搜索树中的众数
给定 BST [1,null,2,2], 1 \ 2 / 21 2 3 4 5 返回 [2]提示:如果众数超过1个,不需考虑输出顺序public class Test20 { static class TreeNode { int val; TreeNode left, right; public TreeNode(int val, TreeNode left, TreeNod
2022-02-16 15:23:39 213
原创 guava cache
guava超时及刷新机制首先看一下三种基于时间的清理或刷新缓存数据的方式:expireAfterAccess:当缓存项在指定的时间段内没有被读或写就会被回收。expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收。refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。考虑到时效性,我们可以使用expireAfterWrite,使每次更新之后的指定时间让缓存失效,然后重新加载缓存。guava cache会严格限制只有1个加载操作(load.
2022-02-16 10:39:51 493
原创 【算法题】二进制数相加
public class Test19 { public static void main(String[] args) { String a = "1010"; String b = "1011"; System.out.println(addBinary(a,b)); } public static String addBinary(String a, String b) { StringBuffer s1 = .
2022-02-15 20:10:21 251
原创 【算法题】二叉树中的最大路径和
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。输入:root = [-10,9,20,null,null,15,7]输出:42解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42以A为根节点的这棵树的最大路径和可.
2022-02-15 13:36:15 287
原创 【算法题】二叉树寻找最小公共祖先
输入:4,5。输出:2。输入:4,9。输出:1.从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。 如果都不匹配,则分别递归左、右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则root就是LCA. 如果两个key都出现在左子树,则说明LCA在左子树中,否则在右子树。public class Test16 { static class Node { int val; ...
2022-02-11 23:16:52 810
原创 【算法题】将链表根据元素的位置模K重组
给定链表与数字K,根据每个节点的位置,对K取余,根据模后的值从小到大重组链表,同余数值的节点保持元素节点相对位置不变。要求只遍历一次链表输入:0-1->2->3->4k=2输出:0->2->4->1->3输入:0-1->2->3->4->5->6->7k=3输出:0->3->6->1->4->7->2->5public class
2022-02-11 11:48:07 376
原创 【算法题】求最大连续1的个数
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3输出:10方法一:滑动窗口法,时间复杂度O(n)思路:其实,将K个0转换为1之后,连续的1组成的子数组长度为最长,这个问题可以转换为:在数组中取一个子数组
2022-02-10 16:32:59 1183
原创 【算法题】寻找链表环的入口
慢走了a+x,快的是慢的2倍,得出2(a+x) = a + nc + x, n为快指针走了环的圈数化简,2a + 2x = a + nc + xa + x = nc a = nc - x a = (n-1)c + (c - x) a = kc + (c-x) , k为常量n-1即,一个指针从头部走a步,另一个从相遇节点走k次环再走(c-x)剩余步数,即是入口节点。...
2022-01-27 17:27:33 538
原创 【算法题】超长大数相减
import org.apache.commons.lang.StringUtils;public class Test8 { public static final int NINE = 9; public static final char ZERO = '0'; public static void main(String[] args) { String b = "8951331230000000000000000000000001"; .
2022-01-26 20:38:17 500
原创 【算法题】求数组除当前位其他数的乘积
public class Test7 { // 输入: 一个长度为n的整数数组input// 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出// 不能使用除法// 例如 input {2, 3, 4, 5} output: {60, 40, 30, 24} public static void main(String[] args) { int[] i.
2022-01-21 16:54:14 297
原创 【算法题】判断树是否是镜像的
public class TestD {// 1// 2 2// 3 4 4 3 public static void main(String[] args) { } public static boolean judgeTreeIsMirror(TreeNode head) { if (head == null) { return tru.
2022-01-19 12:10:09 302
原创 【算法题】求第N个丑数
public class Test6 { public static void main(String[] args) { System.out.println(getUglyNumber(10)); } public static int getUglyNumber(int n) { if (n <= 0) { return 0; } int[] arr = new int[n]; .
2022-01-17 20:59:54 176
原创 【算法题】把数组中的数排成一个最小的数
import com.dianping.cat.util.StringUtils;import java.util.Arrays;import java.util.Comparator;public class Test5 { public static void main(String[] args) { int[] input = {3, 32, 321}; System.out.println(joinToMinNumber(input)); .
2022-01-17 20:26:54 443
原创 【算法题】从1到n整数中1出现的次数
public class Test4 {// 我的想法是,每一次求一个位置上的1的个数,第一轮先求个位上的1出现的个数,第二轮求十位上1出现的个数,以此类推...这样就能保证每个位置上的1都数了一次,并且不会出现多次重复数的情况。现在以其中的某一轮循环为例:假设现在有一个数 n = abcd(a,b,c,d分别表示0 ~ 9中的任意数)。我们本次循环要数的是b所在位置上1出现的个数。也就是要求满足X1XX这个样子的数的个数。我们可以将abcd分成两个部分,一部分在b前面即a,另一部分在b后面即cd.
2022-01-17 17:13:04 82
原创 【算法题】找出数组最小k个数
思路:总体类似二分查找,部分类似快排。将小于当前元素的数,都放到元素左侧。返回位置,当位置大于K-1时,在左侧找;反之在右侧找。找到第K-1个位置的数后,输出前k个即可。public class Test3 { public static void main(String[] args) { int[] arr = {3, 4, 6, 5, 3, 2, 1}; int k = 3; findKData(arr, k); } pu
2022-01-06 16:04:01 101
原创 【算法题】数组中出现次数超过一半的数字
public class Test { public static void main(String[] args) { int[] chars = {1, 2, 1, 4, 1, 6, 1, 8, 1, 10, 1}; System.out.println(moreThanHalfNum(chars)); } public static int moreThanHalfNum(int[] nums) { int count = .
2022-01-02 17:04:45 87
原创 【算法题】打印字符串中所有字符的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输 入字符串 abc,则打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。 思路:将当前位置的字符和前一个字符位置交换,递归。public class Test { public static void main(String[] args) { char[] chars = {'a', 'b', 'c'}; List&
2022-01-02 16:29:30 243
原创 【算法题】二维数组,顺时针遍历(m*n矩阵)
public static void main(String[] args) { //1 2 3 4 //10 11 12 5 //9 8 7 6 //输出:1 2 3 6 9 8 7 4 5// int[][] arr = {{1, 2, 3, 4}, {10, 11, 12, 5}, {9, 8, 7, 6}}; //1 2 3 //8 9 4 //7 6 5/.
2021-12-29 17:57:27 549
原创 【算法题】二分法变形,在一个两段有序的数组中查找,该数组分两段有序,第一段的数都大于第二段的数。
public static int partition(int[] arr, int left, int right, int key) { if (left > right) { return -1; } int mid = (left + right) / 2; if (arr[mid] == key) { return mid; } if (...
2021-12-27 20:05:40 334
原创 mysql 双路排序和单路排序
Mysql中单路排序和双路排序详解_自由的辣条的博客-CSDN博客_单路排序和双路排序文件排序(FileSort)分为两种:双路排序(又叫回表排序模式):先根据相应的条件取出相应的排序字段和可以直接定位行 数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段;单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序;举个例子,下面有一段sql:select * from user where name = "自由的辣条" .
2021-12-16 11:55:04 939
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人