- 博客(39)
- 收藏
- 关注
原创 线上 cpu 负载过高 - java 原生 interrupt 使用不当
中断:其实就是一个状态位,默认为 false,当你调用 interrupt 方法时,会将中断状态置为 true,当线程因为调用 sleep,wait 等方法被阻塞时,会抛出 InterruptedException,这时中断状态位会置为 false。从上面所说可以看出,调用 interrupt 后并没有把线程终止,所以需要我们自己去处理,将 formatTransporter 修改如下,增加被中断时跳出循环,使线程正常结束,如果发生中断异常,也需要进行处理,使线程可以结束。那么这样些会不会有什么问题呢?
2022-11-04 18:53:11
131
原创 无重复字符的最长字串(java版)
无重复字符的最长字串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解法1:暴力破解遍历所有的子串,找出最长的解法2:滑动窗口简单思路:第一轮:[a] // 无重复字串,记录最大长度 1第二轮:[a, b] // 无重复字串,记录最大长度 2第三轮:[a, b, c] // 无重复字串,记录最大长度 3第四轮:
2022-04-13 22:35:55
1584
原创 redis 持久化
redis 持久化便于灾难恢复,相当于高可用,在 redis 宕机之后可以很快的恢复数据,保证数据不丢失。默认俩种持久化都开启时,redis 使用 aof 恢复数据rdb快照方式,每次存储记录的时候都是通过 fork 出一个子线程,子线程首先将数据存放到一个临时文件中,等到将数据写完后,在采用原子的方式将旧的 dump.rdb 文件替换掉fork:Linux fork 函数,对本来的进程复制出一份子进程,父进程可以继续做自己的事情(响应客户端的写操作),子进程进行 rdb 的写磁盘优点:
2022-02-26 09:56:20
95
原创 MyBatis-Plus 学习
MyBatis-Plus 学习什么是 MyBatis-Plus官网解释:MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它主要就是对 Mybatis 做了封装,可以提高我们的开发效率,它的出现就是为了简化我们的开发,将一些简单的增删改查操作进行封装,不需要我们在配置文件中去实现特性无侵入:只做增强不做改变,引入它不会对现有工程
2021-05-05 15:24:45
234
原创 mysql 查询 in 操作
在 mysql 查询中,如果使用 in 查询,默认会按照主键进行排序,不会按照in 中的顺序查询解决方案:select * from 表名 in(2,1) order by(id, 2,1)
2021-02-07 20:02:28
466
1
原创 剑指 offer 7 斐波那契数列
斐波那契数列大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39代码public class 斐波那契数列 { // 递归,可以优化,将计算过的值存储起来 public int fib(int n) { if (n == 0){ return 0; } if (n == 1){ return 1;
2020-08-01 20:29:51
128
原创 剑指offer 6 旋转数组的最小数字
旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析俩种方法:直接遍历数组,找到最小的值,时间复杂度近似为O(n)使用二分查找,时间复杂度近似为O(logn)因为是非递减数列,所以,中间的值大于右边时,说明最小值在右边中间值小于左边时,最小值在左边
2020-08-01 20:28:49
92
原创 剑指 offer 4 重建二叉树
重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析/** * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉
2020-07-28 18:44:31
124
原创 剑指 offer 3 从尾到头打印列表
从尾到头打印列表输入一个链表,按链表从尾到头的顺序返回一个ArrayList。分析可以将数据保存到一个数组中,然后逆序遍历,加入 list递归代码 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<>(); while (listNode != null
2020-07-28 18:43:32
106
原创 在增强 for 循环中调用 ArrayList 的 remove 方法
**在增强 for 循环中为什么删除元素为什么会报错?增强 for 循环,在底层使用的也是迭代器// 源代码public class Hello { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3);
2020-07-23 16:10:51
1267
原创 剑指offer 2 替换空格
替换空格请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。分析:将一个字符替换为三个字符,字符串的长度增加,所以需要移动字符,在 java 中也可以使用 StringBuilder 进行拼接,但是需要额外的空间,在原字符串上进行移动,扩容的空间较少,这里对第二种进行分析字符串的遍历有俩种从左往右:替换一个字符后会覆盖原来的字符从右往左:如果是空格就替换字符,不是空格就直接移动源
2020-07-22 16:06:43
89
原创 剑指offer 1 二维数组中的查找
二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析: 首先,对于查找,我们最先能想到的就是遍历数组,挨个进行比较,但是效率是非常低的,最坏的时间复杂度是 O(n2),所以我们必须去优化它。**查找其实也就是排除的过程,只要排除的越多,说明效率越高,**像挨个遍历,每一次只能排除一个,所以效率低,题目中的二维数组是有规律的,例如要在下面的
2020-07-22 16:05:36
138
1
原创 快速排序
一、快速排序快速排序就是在待排序数组选取一个基准值,把比基准值大的元素放在右边,小的元素放在左边,然后递归的去对左边和右边执行相同操作。二、分析三、代码 public void quickSort(int[] arr, int start, int end){ // 条件成立,说明当前序列已经有序 if (start >= end){ return; } // 基准值,左边的都比基准值小,右边的都比基准值
2020-07-21 07:38:01
79
原创 堆排序
一、基本介绍堆排序:是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。升序大顶堆,降序小顶堆二、分析将初始待排序数组构建成大顶堆,此堆为初始的无序区;将堆顶元素和最后一个交换,此时最后一个元素已经是有序的由于交换后堆顶元素可能不符合大顶堆,所以将前 n - 1 个元素继续调整为大顶堆,不断重复,直到有序元素个数为 n - 1三、代码public class HeapSort { p
2020-07-19 21:48:28
109
原创 归并排序
一、基本介绍归并排序:使用分治的思想,将一个数组划分成俩个数组,在将这俩个数组继续划分,直到不能划分为止,然后将数据合并,最后就是一个有序的数组二、分析例如对数组 {8,4,5,7,1,3,6,2} 进行排序。使用中间数组,将每一次排序后的数值,放回原数组的位置,下面是最后一次合并的流程:三、实现public class MergeSort { private void mergeSort(int[] arr, int left, int right, int[] temp){
2020-07-19 21:47:21
65
原创 spring-boot 博客系统
Spring-boot 个人博客系统GitHub:https://github.com/Werdio66/myblog一、环境搭建gradle 依赖: implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springf
2020-06-08 08:38:49
417
原创 基于 ssm 的权限管理系统
RBAC :基于角色的访问控制,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。为什么需要权限管理系统 ?防止操作失误将数据库中的数据修改不同的权限能看到和操作的数据不同功能模块技术
2020-05-11 21:12:43
2499
原创 BIO, NIO, AIO
同步,异步,阻塞,非阻塞同步:a 事件必须等到 b 事件完成才可以继续执行/返回异步:a 事件可以先执行/返回,不需要等待 b 事件的完成,而是通过回调处理 b 事件的返回结果阻塞:当发起一次请求时,调用者一直等待结果的返回,只有当条件满足时,才继续处理后续的工作非阻塞:当发起一次请求时,调用者不用一直等待结果的返回,可以先去做其他的事情1、BIO(Blocking IO)同步阻塞...
2020-04-24 20:25:20
64
原创 和为 s 的连续正数序列
和为 s 的连续正数序列 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 /** * 双指针,滑动窗口 * * target = 9 * * 左指针 left = 0,右指针 right = 1; * sum = 3...
2020-03-06 21:46:18
140
原创 和为 s 的俩个数
和为 s 的俩个数 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。穷举法 /** * 穷举法 */ public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; ...
2020-03-06 21:45:29
99
原创 给定一个二叉树,检查它是否是镜像对称的。
一、题目描述给定一个二叉树,检查它是否是镜像对称的。二、分析满足镜像对称的条件:必须是俩个结点(t1,t2);t1,t2的值必须相等;t1的左结点和t2的右结点必须同时为空或者同时有值;t2的右结点和t1的左结点必须同时为空或者同时有值;三、解法1.使用递归public boolean isSymmetric(TreeNode root) { return ...
2020-03-06 17:28:51
394
原创 根据前序遍历和中序遍历还原二叉树
一、题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二、分析由前序遍历的定义可以知道,数组中的每一个值都是当前子树的根结点,根据根结点在中序遍历中的位置,我们可以将这颗树分为左右俩个子树,分别在对...
2020-03-05 21:18:03
551
原创 快速排序
快速排序快速排序就是在待排序数组选取一个基准值,把比基准值大的元素放在右边,小的元素放在左边,然后递归的去对左边和右边执行相同操作。 public static void quickSort(int[] arr, int left, int right){ int l = left; int r = right; int pivot = arr[...
2020-03-03 19:54:38
81
原创 希尔排序
一、基本介绍希尔排序:是一种改进后的插入排序,希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序,当增量减至 1 时,整个数组被分成一组,排序就完成了。二、分析当序列为 7,6,4,3,2,1 时,对 1 进行插入排序,需要和每一个都去比较,但是使用希尔排序时,可以将数组分为多组,例如刚开始分为 3 组,先对 {7,3},{6,2},{3,1} 进行排序,排序后 3,2,1,7,6...
2020-02-27 20:08:37
91
原创 ConcurrentHashMap
jdk 1.8 ConcurrentHashMap1、数据结构数组 + 链表 + 红黑树2、put 流程图3、源代码字段 // 当值为负数时,表示正在初始化数组或者调整大小 private transient volatile int sizeCtl;put 方法 public V put(K key, V value) { return...
2020-02-26 14:11:40
78
原创 HashMap
jdk 1.8 HashMap1、数据结构数组 + 链表/红黑树2、put 流程图3、源代码几个重要的常量 // 默认的容量是 16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 最大容量 static final int MAXIMUM_CAPACITY = 1 &...
2020-02-26 13:26:14
120
原创 插入排序
一、基本介绍插入排序:是对要排序的元素以插入的方式找寻改元素适当的位置,以达到排序的目的,把 n 个待排序的元素看做一个有序表和一个无序表,开始的时候有序表只有一个元素,无序表有 n-1 个元素,排序的过程从无序表选取第一个元素和有序表中的元素进行比较,将它加入到适当的位置。二、分析例如对数组 {5,3,7,6,2} 进行排序。第一轮刚开始有序表中的元素是 5;待插入元素是 3第一次...
2020-02-25 19:36:44
112
1
原创 选择排序
一、基本介绍选择排序:第1次从 [0, n-1] 个数中选取最小的元素和第1个数交换,第2次从[1, n-1]选取最小的元素和第2个数交换,第n-1次从[n-2, n-1]个数中找出最小的数和第n-1个数交换,总共用了n-1次。二、分析例如:对 6,3,7,2,5 排序。第一轮排序:使用 index 记录最小值的下标,value 记录最小的值;(1) index = 3;value ...
2020-02-24 21:11:19
99
原创 使用俩个栈实现排序
使用俩个栈实现排序public ArrayList<Integer> twoStacksSort(int[] numbers) { // 存放所有的数 Stack<Integer> initStack = new Stack<>(); // 存放排好序的数 Stack<Integer> sort...
2020-02-23 16:48:35
806
原创 冒泡排序
一、基本介绍通过对待排序列从前向后,从下标小的元素向下标大的移动,依次比较相邻元素的值,若逆序则交换。二、分析例如:对 6,3,7,2,5 排序。第一轮排序:(1) 3,6,7,2,5(2) 3,6,7,2,5(3) 3,6,2,7,5(4) 3,6,2,5,7第一轮排序后,最大的数字已经在最后了。第二轮排序:因为最后一个数字已经是排好序的,所有没有必要比较。(1) 3,...
2020-02-23 11:54:41
104
转载 idea用springMVC时报java.lang.ClassNotFoundException: org.springframework.web.servlet. DispatcherServlet
链接:https://blog.csdn.net/du_23tiyanwang/article/details/80654313
2019-11-03 14:55:23
119
原创 单例模式
单例模式指一个类只有一个实例,且该类能自行创建这个实例的一种模式。特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点;优点:1.节省内存资源、2.保证数据内容的一致性3.避免对共享资源的多重占用。单例模式的实现:1.懒汉式:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这...
2019-07-25 13:37:24
85
原创 开闭原则
定义:对扩展开放,对修改关闭。开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性。作用:1. 对软件测试的影响软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。2. 可以提高代码的可复用性粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。...
2019-07-24 22:04:26
91
原创 网络编程-控制台聊天
第一个版本:可以实现简单的交互,把服务器当做客户客户端:实现了简单的发送数据到服务器和接收服务器返回的数据package chat.day_01;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/*...
2019-03-01 13:42:57
308
原创 io
文件:FileFilenameFilter(接口)RandomAccessFile:随机访问文件的读取和写入常见的字符集:ASCLL:占一个字节,只能包含128个符号,不能是汉字ISO-8859-1:占一个字节,不能是汉字GBK:占俩个字节,支持中文UTF-8:占三个字节,支持中文四大基流:先有字节流后有字符流,字符流是对字节流的补充I...
2019-02-28 15:38:22
87
转载 java基础知识
1.开发Java语言的公司?美国Sun (Sun Microsystems)公司开发。2.Java的3个版本?J2SE(Java2 Standard Edition) 标准版J2EE(Java 2 Platform,Enterprise Edition) 企业版J2ME(Java 2 Micro Edition) 微小版在5.0以后新版本中称作:JavaSE JavaEE ...
2019-02-26 09:44:36
106
原创 十进制转八进制
给一个十进制数,输出它的八进制数。由于取余所得得到数需要逆序输出,符合栈的特征(后进先出),所以使用栈来完成。源代码: #include <stdio.h>#include <stdlib.h>typedef struct SNode{ int date; //数据域 struct SNode *next;}SNode,*Sq...
2018-10-28 15:21:01
2392
2
原创 约瑟夫环
已知n个人(以编号1,2,···,n分别表示)围坐在一个桌子周围,从编号为k的人开始报数,数到的那个人出列,他的下一个人又从1开始报数,数到m的那个人又出列,依次重复下去,要求找到最后出列的人。 使用了 单向循环链表。 源代码:#include <stdio.h>#include <stdlib.h>typedef struct A{...
2018-10-27 16:15:22
124
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人