- 博客(216)
- 收藏
- 关注
原创 框架的核心知识
(6)前端控制器DispatcherServlet将返回的ModelAndView对象传给视图解析器ViewResolver进行解析,解析完成之后就会返回一个具体的视图View给前端控制器。在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。(2)前端控制器接收到请求以后调用处理器映射器HandlerMapping,处理器映射器根据请求的URL找到具体的Handler,并将它返回给前端控制器;
2025-02-26 19:28:15
333
原创 Effective Java读书笔记 draft
优势:1、有名字,代码更容易阅读理解;2、不用每次被调用时都创建新对象;3、可以返回原返回类型的子类;4、在创建带泛型的实例时,代码更简洁。
2025-02-26 18:01:28
131
原创 基础算法整理
public class BinarySearch { //1、普通的二分查找 public static int binarySearch(int[] arr,int target){ if(arr.length==0) return -1; int left=0,right=arr.length-1; while(left<=right){ int mid=left+(right-left)/2
2025-02-26 17:57:42
249
原创 Java一揽子集合整理
Deque,双端队列,addFirst/offerFirst,remove/poll,get/peek,push/pop模拟栈。Queue,单端队列,插入队尾,add/offer,删除队首remove/poll,获取队首element(),peek()ConcurrentHashMap,线程安全,1.7之前segment数组+链表,1.8之后node数组+红黑树。HashMap,数组+链表,1.8后链表改为红黑树(数组长度大于64,链表长度大于8)关键字进行同步处理,相关方法push,pop,peek。
2025-02-26 17:45:30
319
原创 MySQL死锁问题排查
比如:事务1在表1上加了S锁后,事务2想要更改某行记录,需要添加IX锁,由于不兼容,所以需要等待S锁释放;如果事务1在表1上加了IS锁,事务2添加的IX锁与IS锁兼容,就可以操作,这就实现了更细粒度的加锁。如果 T1 持有 r 的 x 锁,那么 T2 请求 r 的 x、s 锁都不能被立即允许,T2 必须等待T1释放 x 锁才可以,因为X锁与任何的锁都不兼容。InnoDB 实现了标准的行级锁,包括两种:共享锁(简称 s 锁)、排它锁(简称 x 锁)。事务持有什么锁,在等待什么锁。
2025-02-26 17:32:02
911
原创 Innodb MVCC实现原理
MVCC全称多版本并发控制,是在并发访问数据库时对操作数据做多版本管理,避免因为写数据时要加写锁而阻塞读取数据的请求问题。
2025-02-26 16:58:25
869
原创 关于位运算的总结
基础:计算机中数据的存储是以二进制形式保存的,其中负数是以补码的形式存储。最高位表示符号位:0表示正,1表示负正数的原码、反码、补码相同;负数的反码为原码符号位不变,数值位按位取反,补码是反码加1.进制转换:十进制转 x 进制,直接除x取余。任何十进制都可以使用多个不同的2的x次幂组成,因为本身就可以用二进制表示。关于移位:<<:左移运算符,num << 1,相当于num乘以2>>:右移运算符,num >> 1,相当于num
2021-09-21 10:25:50
210
原创 绿盟Java面经
1、自我介绍2、项目相关账号激活实现为什么使用前缀树做敏感词过滤Redis持久化Kafka怎么保证消息不丢失和重复消费Elasticsearch使用线程池使用情景3、微服务理解4、注册中心5、服务调用6、实际情景中sql慢怎么排查和解决问题7、索引失效?8、为什么使用B+树不使用二叉树或其他数据结构?9、海量数据获取最大的前100个元素?除了最小堆还有什么方式?桶的思想,拆分成多个小组,每组排序得到最大的前100个元素,然后利用归并的思想。
2021-08-30 17:22:22
350
原创 IDEA设置文件编码格式
文件字符编码自定义异常状态码和提示信息时,创建的properties文件的字符集如果不是utf8,则返回的提示信息在测试时或者返回给前端就会出现乱码,此时可以更改idea的编码格式。
2021-08-30 11:48:14
1601
转载 一道题理解二进制子集枚举与状态压缩
相关理论1、二进制子集枚举对于一个二进制数,其子集指的是对于原二进制数中1的选择,如对于一个二进制数01101,有三个1,则有8个子集,分别为01101,01100,01001,00101,01000,00100,00001,00000。方法一:暴力枚举// m => 总状态数for (int i = 1; i < m; i++) { // 从 [1, i] 就可以了,后面的一定不会是 i 的子集 for (int j = 1; j <= i; j++)
2021-08-30 11:18:58
482
原创 远景Java面经
1、谈谈ThreadLocal2、线程池原理3、Java内存区域4、新生代、老年代设计新生代为什么设计成eden、survivor区?5、GCRoots6、Java的两种锁synchronized锁升级过程ReentrantLock底层。7、AQS8、Nacos基础架构9、分库分表逻辑10、Fegin的优势11、事务的隔离级别为什么现在公司一般把隔离级别设置成读取已提交。...
2021-08-27 22:28:25
189
原创 List和数组的相互转换
List转数组:List<Integer>list=new ArrayList<>();Integer[] arr=new Integer[list.size()];list.toArray(arr);数组转list:Integer[] num=new Integer[]{1,2,3};List<Integer> list=Arrays.asList(num);注意:因为集合里面的数据类型只能是包装数据类型,所以int类型数组先转为包装类型的数组
2021-08-11 22:00:12
737
原创 String类型、Integer类型的数组转为int类型数组
将String类型和Integer类型的数组转为int类型的数组,一种方法是通过for循环的方式,另一种就是利用java8的stream。String类型的数组转为int类型的数组:String[] numstr=new String[]{"1","2","3"};int[] num= Arrays.stream(numstr).mapToInt(Integer::valueOf).toArray();Integer类型的数组转为int类型的数组:Integer[] numIntege
2021-08-11 21:40:08
6147
1
原创 自动装箱和自动拆箱
基本数据类型转换为包装数据类型时,叫做装箱;包装数据类型转换为基本数据类型时,叫做拆箱;基本数据类型和包装类型的一个区别就是初始值不一样,如int的初始值为0,而Integer的初始值为null。自动装箱和自动拆箱:Integer total = 99; //自动装箱执行上面那句代码的时候,系统为我们执行了: Integer total = Integer.valueOf(99);int totalprim = total; //自动拆箱执行上面那句代码的时候,系统为我们执行了:
2021-08-11 21:23:35
219
原创 向上转型和向下转型
1、父类引用指向子类对象,而子类引用不能指向父类对象。2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换,如:Father f1 = new Son();3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换举例:// 父类引用指向子类对象Father f1 = new Son(); // 这就叫 upcasting (向上转型)// 指向子类对象的父类引用赋值给子类引用,此时父类引用f1还是指向子类对象So
2021-08-11 18:28:22
116
转载 一致性哈希算法原理及应用
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。.
2021-08-11 16:27:15
367
原创 Java输入输出
书籍:Java数据结构和算法(第二版) Robert Lalore著一、综述private关键字修饰的字段,只能在同一个类中访问,例如在main()中创建了对象,不能通过对象访问被private修饰的字段,只能访问对象中提供的public方法。赋值:对象2=对象1,表示对象2拷贝了对象1指向的存储地址,对象2和对象1实际上指的是同一个对象。参数传递:简单数据类型是值传递;对象是以引用的形式传递,即创建的对象和传递的参数都指向同一个对象。==和equals:==判断类的引用是否一致,equ
2021-08-11 16:24:00
97
原创 图解系统学习笔记
一、硬件结构1.1CPU是如何执行程序的?冯 诺伊曼模型:内存:存储程序和数据,存储区域是线性的,最小的存储单位是字节,1字节等于8位。中央处理器(CPU):32位和64位CPU最主要区别在于一次能计算多少字节数据。如32位CPU一次能计算4个字节,计算的最大整数是2^32;其次32位CPU最大只能操作4GB的内存,而64位CPU的寻址范围理论为2^64。CPU内部的一些组件,控制单元负责CPU工作,逻辑运算单元负责计算,寄存器主要存储计算时的数据(通用寄存器,用来存放需要进行运算的数据
2021-08-11 15:57:18
1426
原创 SQL union和union all操作符总结
union操作符用于合并两个或多个select语句的结果集。union内部的select语句查询字段的数量、数据类型以及顺序必须相同。union不允许值重复,输出的的不重复的值。SELECT column_name FROM table_name1UNIONSELECT column_name FROM table_name2union all和union命令几乎等效,union all会列出所有的值,允许重复。SELECT column_name FROM table_name
2021-08-11 11:01:39
181
原创 SQL查询优先输出某结果,其他正常输出
查询sutdent表中的学生信息(name、age),其中age在20到30之间的优先输出,其他正常输出。前置知识:case whenselect name,age, (case when age between 20 and 30 then 0 else 1 end)remarkfrom studentorder by remark;...
2021-08-10 20:57:03
2791
原创 一文弄懂拓扑排序
原理:在一个有向图中,对所有节点进行排序,要求没有一个节点指向它前面的节点。通过邻接矩阵或邻接表建图后,统计所有节点的入度,分离出入度为0的节点,然后把这个节点指向的节点的入度减1,直到所有节点都被分离。例如下面(a)图的一种拓扑排序过程:应用:思路:对队伍排名进行拓扑排序。import java.util.*;public class Main{ public static void main(String[] args){ Scanner ci..
2021-08-10 10:38:08
150
原创 @ControllerAdvice注解实现统一异常处理
@ControllerAdvice注解,可以对Controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理。具体使用1、定义异常处理类,可以返回json格式数据或者跳转到错误页面返回json数据:@ControllerAdvicepublic class CustomExceptionHandler { @ResponseBody @ExceptionHandler(value = Exception.class) pu
2021-08-05 18:20:23
445
原创 I/O模型详解
一、前置知识:为了确保操作系统的安全稳定运行,操作系统启动后,将会开启保护模式:将内存分为内核空间和用户空间,进行内存隔离。应用进程运行在用户空间;内核进程运行在内核空间。用户空间无法直接操作内核空间,只能通过操作系统向外提供的API,发起系统调用。所以应用进程并不能像操作系统内核一样直接进行I/O操作,而是通过向内核发起系统调用完成对I/O的间接访问,一次IO操作实际包含两个阶段:IO调用阶段:应用程序进程向内核发起系统调用 IO执行阶段:内核执行IO操作并返回 2.1. 准备数据
2021-08-05 11:48:33
290
原创 Dijkstra(迪杰斯特拉)算法求单源最短路径
算法思想:将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。用节点 A「更新」节点 B 的意思是,用起点到节点 A 的最短路长度加上从节点 A 到节点 B 的边的长度,去比较起点到节点 B 的最短路长度,如果前者小于后者,就用前者更新后者。
2021-08-02 11:48:55
319
原创 一文搞懂回溯(Backtracking)
Backtracking(回溯)属于DFS。普通DFS主要用在可达性问题,这种问题只需要执行的特定位置然后返回即可。回溯主要用于求解排列组合问题,这种问题在执行到特定位置返回之后还会继续执行求解过程。实现:在访问一个新元素进入新的递归调用时,需要将新元素标记为已经访问,在递归返回时,需要将元素标记为未访问。应用:思路: 对于这类寻找所有可行解的问题,我们都可以尝试用 搜索回溯 来解决。class Solution { //存储结果 List<List<
2021-07-23 10:36:18
275
原创 Java日志框架SLF4j、logback、log4j区别
slf4j是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可。注意它只是一个几口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统如log4j、logback、java.util.logging等,他们实现了具体的日志系统的功能。使用slf4j可以做到多种日志工具的切换使用。logback:实现了slf4j的接口。使用时通常引入xm...
2021-07-22 21:53:11
220
原创 一文搞懂深度优先搜索(DFS)
一、原理深度优先搜索再得到一个新节点时立即对新节点进行遍历,从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行遍历,得到新节点 2,然后继续以上步骤。从一个节点出发,使用DFS对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS常用来解决这种 可达性 问题。实现:递归栈(保存当前节点信息,当遍历新节点返回时能继续遍历当前节点)、标记
2021-07-22 12:25:53
475
原创 递归和迭代两种方式求二叉树遍历
二叉树的前序遍历:根 左 右递归class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer>res=new ArrayList<>(); preorder(root,res); return res; } public void preorder(TreeNode root,Lis
2021-07-21 19:30:19
100
原创 一文搞懂广度优先搜索(BFS)
1、原理:广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历地结果作为起点,遍历一个距离能访问地所有节点。遍历过的节点不能再次被遍历。每一层遍历的节点都与根节点的距离相同。设di表示第i个节点与根节点的距离,推导出一个结论,对于先遍历的节点i与后遍历的节点j,有di<=dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。实现BFS:队列(用来存储每一轮遍历得到的节点);标记(对于遍历过的节点,应该将它标记,防止重复遍历)。2、
2021-07-21 11:39:39
1712
原创 线段树的原理和应用
一、原理简介:假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n))。线段树的原理就是,将[1,n]分解成若干特定的子区间(数量不超过4*n,),然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。结构:对于A[1:6] = {1,8,6,4,3,5}来说,线段树如下所示,红色代表每个
2021-07-20 11:17:52
564
2
原创 一道题理解DP优化
思路与算法:class Solution { public long maxPoints(int[][] points) { int m=points.length,n=points[0].length; int[][] record=new int[m][n]; for(int i=0;i<m;i++){ System.arraycopy(points[i],0,record[i],0,n); ...
2021-07-20 10:16:15
75
原创 树状数组的原理与应用
一、原理简介:「树状数组」是一种可以动态维护序列前缀和的数据结构,它的功能是:单点更新 update(i, v): 把序列 i 位置的数加上一个值 v区间查询 query(i): 查询序列 [1⋯i] 区间的区间和,即 i 位置的前缀和修改和查询的时间代价都是 O(logn),其中 nn 为需要维护前缀和的序列的长度。结构:上图中黑色数组是原来的数组,用A代替,红色数组是我们的树状数组,用C代替,由图可知C[1] = A[1]...
2021-07-16 14:26:33
110
原创 Java集合之TreeSet和TreeMap
一、TreeSetTreeSet和Collection:简介:TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口。TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
2021-07-14 18:27:50
813
原创 Java中的拷贝
1、System.arraycopy()源码:public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);可以看出它是一个本地方法,所以效率比较高。src:源数组 srcPos:源数组要复制起始的位置 dest:目的数组 destPos: 目的数组放置的起始位置 lengt.
2021-07-14 16:06:36
1999
原创 快速幂问题
class Solution { public double myPow(double x, int n) { long N=n; if(N<0){ return pow(1/x,-N); } return pow(x,N); } public double pow(double x,long n){ double res=1.0; while(n>...
2021-07-13 12:43:11
99
原创 Xshell下载、安装和使用
1、下载进入Xshell官网点击Download后点击Download后选择XSHELL后,点击DOWNLOAD点击箭头处后输入相关信息后点击,DOWNLOAD,然后点击邮箱收到的链接下载。2、安装找到下载好的文件双击后选择自己的安装目录安装成功。3、使用新建会话确定后点击创建的会话输入用户名输入密码连接成功4、Xshell上传文件到服务器...
2021-07-12 17:25:23
637
原创 Arrays.sort()和Collections.sort()的比较
1、Arrays.sort()源码: public static <T> void sort(T[] a, Comparator<? super T> c) { if (c == null) { sort(a); } else { if (LegacyMergeSort.userRequested) legacyMergeSort(a, c);
2021-06-28 16:55:19
518
1
原创 Comparable接口和Comparator接口比较
1、Comparable接口Comparable定义在Person类的内部,实现了compareTo方法 private static class Person implements Comparable<Person>{ int age; String name; public Person(String name, int age) { this.name = name; this.age = age; } publ
2021-06-28 16:44:03
128
原创 linux实践
1、Linux命令连接符‘|’:在Linux中作为管道符,将‘|’命令前的输出作为‘|’命令后的输入。‘||’:用双竖线’||'分割的多条命令,代表的是或者,执行的时候遵循如下规则,如果前一条命令为假,则继续执行后面的命令,如果前一条命令为真,则后面的命令不会执行。‘&&’:可同时执行多条命令,代表的是且,当碰到执行错误的命令时,将不再执行后面的命令。如果一直没有错误的,则执行完毕。‘&’:同时执行多条命令,不管命令是否成功。通过命令连接符,我们就可以同时使用多条
2021-05-28 17:18:38
97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人