- 博客(108)
- 收藏
- 关注
原创 345-java人事档案管理系统的设计与实现
本项目为基于Java语言的人事档案管理系统,旨在帮助企事业单位高效管理员工档案信息,实现档案的电子化、自动化管理。系统涵盖了员工信息的录入、查询、修改、删除等功能,同时具备权限控制和安全保障机制。
2025-04-04 09:19:22
395
原创 美团动态ThreadPoolExecutor底层实现源码实战
介绍springboot连接nacos实现动态线程池,同时得安装nacos,同时代码将有两个模块,dtp-spring-boot-starter 与 user 模块,前者将是独立的动态线程池,可以引入自己的项目中,后者模块主要用于测试与使用动态线程池模块。注意springboot与nacos的适配版本!
2023-10-24 21:09:39
537
原创 阻塞队列BlockingQueue实战及其原理分析
是限定在一端进行插入,另一端进行删除的特殊线性表。允许出队的一端称为队头,允许入队的一端称为队尾。先进先出(FIFO)线性表。
2023-10-24 15:09:36
312
原创 并发容器(Map、List、Set)实战及其原理
Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。所以,Java先提供了同步容器供用户使用。同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低。因此为了解决同步容器的性能问题,所以才有了并发容器。
2023-10-19 21:22:24
520
原创 算法组-常见的数据结构基础
第三次压入8:数据站直接入栈,如果当前数不比最小栈栈顶小,重复压入最小栈栈顶5。第二次压入5:数据栈直接入栈,如果当前数比最小栈的栈顶要小,直接入栈。以此类推~,同时两个栈,入栈是同步的。:实现两个栈,一个数据栈(正常栈),一个最小栈,1)单链表和双向链表如何反转。第一次压入7:压入两个栈中。要求复杂度都为O(1)
2023-10-15 18:48:17
189
原创 读写锁ReentrantReadWriteLock&StampLock详解
读写锁ReadWriteLock,顾名思义一把锁分为读与写两部分,读锁允许多个线程同时获得,因为读操作本身是线程安全的。而写锁是互斥锁,不允许多个线程同时获得写锁。并且读与写操作也是互斥的。读写锁适合多读少写的业务场景。
2023-10-15 16:27:51
262
原创 JUC并发工具类在大厂的应用场景详解
ReentrantLock具体应用场景如下:1.解决多线程竞争资源的问题,例如多个线程同时对同一个数据库进行写操作,可以使用ReentrantLock保证每次只有一个线程能够写入。2.实现多线程任务的顺序执行,例如在一个线程执行完某个任务后,再让另一个线程执行任务。3.实现多线程等待/通知机制,例如在某个线程执行完某个任务后,通知其他线程继续执行任务。
2023-10-11 19:30:06
479
原创 算法组-异或运算与面试题
将a的二进制取反然后+1就能获取到最右侧1的位置,再与原来的数&运算,就获取到这个值。异或:相同为0,不同为1 (又称不仅为的无进位相加)异或:相同为1,不同为0。
2023-10-11 11:51:38
170
原创 CAS详解和学透面试必问并发安全问题
什么是原子性?相信很多同学在工作中经常使用事务,事务的一大特性就是原子性(事务具有 ACID四大特性),一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作 A和B 都包含多个步骤,如果从执行 A的线程来看,当另一个线程执行B时,要么将B 全部执行完,要么完全不执行 B,执行B的线程看A的操作也是一样的,那么A 和 B对彼此来说是原子的。
2023-10-09 19:55:14
486
原创 导致 JVM 内存泄露的 ThreadLocal 详解
JVM 利用设置的Key为弱引用,来避免内存泄露。JVM 利用调用 removegetset方法的时候,回收弱引用。当 ThreadLocal 存储很多Key为null的Entry的时候,而不再去调用remove、 get、set方法,那么将导致内存泄漏。使用。
2023-10-08 18:47:08
284
原创 从0开始深入理解并发、线程与等待通知机制(下)
Java 支持多个线程同时访问一个对象或者对象的成员变量,但是多个线程同时访问同一个变量,会导致不可预料的结果。关键字 synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,使多个线程访问同一个变量的结果正确,它又称为。
2023-10-07 15:44:25
86
原创 从0开始深入理解并发、线程与等待通知机制(中)
二,一,Java中线程的状态分为61. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE)Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 CPU的使用权,此时处于就绪状态(ready就绪状态的线程在获得CPU。
2023-10-05 11:17:21
136
原创 第十二届2023软件杯国家二等奖赛后感想&总结
首先我是个双非院校的学生,专业为计算机科学与技术,打这个比赛是在大二下的暑假开始的,最终选的赛道为A6的智慧学工平台,然后今年比赛9月份到南京线下进行总决赛,拿到了国家二等奖。如下图为各个关键月份。
2023-10-04 17:17:59
1110
3
原创 从0开始深入理解并发、线程与等待通知机制(上)含大厂面试题
一,基础概念一,基础概念在正式学习 Java的并发编程之前,还有几个并发编程的基础概念我们需要熟悉和学习。进程与线程进程(就是一代代码的执行程序,程序的实例)我们常听说的是应用程序,也就是 app,由指令和数据组成。但是当我们不 运行一个具体的 app时,这些应用程序就是放在磁盘(也包括U盘、远程网络 存储等等)上的一些二进制的代码。一旦我们运行这些应用程序,指令要运行, 数据要读写,就必须将指令加载至 CPU,数据加载至内存。
2023-10-04 16:15:16
360
原创 Springcloud实战之自研分布式id生成器
日常开发中,我们需要对系统中的各种数据使用 ID唯一表示,比如用户ID 对应且仅对应一个人,商品 ID对应且仅对应一件商品,订单ID对应且仅对应 一个订单。我们现实生活中也有各种 ID,比如身份证ID对应且仅对应一个人, 简单来说,ID就是数据的唯一标识。一般情况下,会使用数据库的自增主键作为数据 ID,但是在大数量的情况 下,我们往往会引入分布式、分库分表等手段来应对,很明显对数据分库分表后 我们依然需要有一个唯一 ID来标识一条数据或消息,数据库的自增ID已经无法 满足需求。
2023-09-25 21:35:16
1075
原创 Springboot整合之Shiro和JWT技术实现无感刷新
一、Shiro简介Shiro是Java领域非常知名的认证()与授权 ()框架,用以替代JavaEE中的JAAS功能。相 较于其他认证与授权框架,Shiro设计的非常简单,所以广受好 评。任意JavaWeb项目都可以使用Shiro框架,而Spring Security 必须要使用在Spring项目中。所以Shiro的适用性更加广泛。像什么JFinal和Nutz非Spring框架都可以使用Shiro,而不能使用框架。1.1什么是认证?
2023-09-22 19:47:48
885
原创 Springboot抵御即跨站脚本(XSS)攻击
把请求传入请求包装类,装饰器模式就会替代请求对象中对应的某个方法。所以我们应该挑选一个简单一点的自定义请求类的方式。攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网。过滤器拦截所有请求,然后把请求传入包装类,这样包装类就能覆盖所有请。攻击最有效的办法就是对用户输入的数据进行转义,然后存储到数据库里面。如果黑客在这个网页发帖的时候,填写的。,这个类是请求类的包装类,用上了装饰器模式。求的参数方法,用户从请求中获得数据,全都经过转义。,黑客依然可以轻松的冒充已经登陆的用户。
2023-09-22 18:51:14
546
原创 数据结构与算法之Set&布隆过滤器
布隆过滤器是一个非常巧妙的数据结构,在很多高并发大数据项目中都有应用,它的特点就是高效的查找和插入,他的核心一句话就是: 我告诉你不存在的那就肯定不存在,但是我告诉你存在,其实有可能存在的。Map:Map是键值对的形式存储,会有key+value: Map不允许出现相同的key,出现就会倍覆盖 Map主要实现方式:HashMap,HashTable,TreeMap(也是一个有序的,默认按照自然顺序,其底层结构同样是红黑树)为什么是可能在序列中呢?Set是一种数据结构,它的特点是里面所存的元素是不能重复的。
2023-09-18 19:23:27
222
原创 数据结构与算法之Hash&BitMap
比如假设我们有N{2,3,64}个数中最大的是MAX,那么我们只需要开int[MAX /32+1]个int数组就可以存储完这些数据,具体可以看以下结构: Int a : 0000 0000 0000 0000 0000 0000 0000 0000 这里是32个位置,我们可以利用每个位置的0或者1来表示该位置的数是否存在,这样我们就可以得到以下存储结构:具体我们可以画个图来展示。我们再来看data[2]的第二位是否是1,如果是1则列表中存在65,否则不存在。右移 >>:8 >> : 8 / 4 = 2。
2023-09-18 16:14:20
254
原创 数据结构与算法-Hash算法
1.初始大小:HashMap默认的初始大小是16,这个默认值是可以设置的,如果事先知道大概的数据量有多大,可以通过修改默认初始大小,减少动态扩容的次数,这样会大大提高HashMap的性能。:当我们往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找,看是否有空闲位置,直到找到为止。英文就是Hash Table,也就是我们经常说的哈希表,大家肯定经常听到,其实刚刚上面我们的那个例子就是运用了散列表的思想来解决的 散列表用的是数组支持按照。
2023-09-15 17:24:59
69
原创 数据结构与算法-堆树
堆是什么?堆是一种特殊的树,他需要满足以下两点:1.是一颗完全二叉树(除了最后一层,其他层每个节点都是满的且最后一层的节点都要靠左排列。2.其每一个节点的值都大于等于或者小于等于其左右子节点的值。但是和二叉搜索树不同: 左节点小于根节点,右节点大于根节点小顶堆大顶堆。
2023-09-14 17:08:37
99
原创 数据结构与算法之(赫夫曼树,哈夫曼树,压缩软件)
比如在压缩算法里面我们可以用二进制来代替 假设字符是 a b c d 4种 那我们假定 a=000 b=001 c=010 d=100,这样我们每个字符就变成了3bit的二进制,那么10000个字符就是30000bit,比起原来的80000bit是不是缩小了很多的存储空间?什么叫不可逆:MD5这样的Hash加密,简单的MD5已经破解了,穷举:很大的库。而且,任何一个字符的编码都不是另一个的前缀,在解压缩的时候,我们每次会读取尽可能长的可解压的二进制串,所以在解压缩的时候也不会产生歧义。
2023-09-11 11:42:57
293
原创 数据结构与算法-Btree&B+Tree
当创建联合索引时,索引由多个列组成,例如(A, B, C),其中A是最左边的列,B是中间的列,C是最右边的列。第二层的数据量是1170*1170=1368900,问题在于第三层,因为innodb的叶子节点,是直接包含整条mysql数据的,如果字段非常多的话数据所占空间是不小的,我们这里以1kb计算,所以在第三层,每个节点为16kb,那么每个节点是可以放16个数据的,所以最终mysql可以存储的总数据为1170*1170*16=21902400(千万级条)。(5)叶节点的高度一致:这个的 好处是什么?
2023-09-10 19:33:39
170
原创 数据结构与算法-二叉搜索树&红黑树
而且,它对于算法面试也几乎没什么用,一般情况下,正常的人也不会要你手写红黑树,最多只会问你一下原理,但是二叉搜索树就是必须要掌握的了,这个我在面试中就可能会要你写伪代码。1.变颜色的情况:当前结点的父亲是红色,且它的祖父结点的另一个子结点 也是红色。(叔叔结点): (1)把父节点设为黑色 (2)把叔叔也设为黑色 (3)把祖父也就是父亲的父亲设为红色(爷爷) (4)把指针定义到祖父结点(爷爷)设为当前要操作的.2.左旋:当前父结点是红色,叔叔是黑色的时候,且当前的结点是右子树。一直要找到它应该插入的位置。
2023-09-10 12:20:10
275
原创 数据结构与算法-树论基础&二叉树
大家最先想到的肯定是链表,对的, 是要借用链表来实现,但是数组的性能是高效的,也不需要开额外的指针,大家来看以下几个结构:下图中的结构除了一颗不是树其余的都是,我们可以发现这个跟我们现实生活的树是不是非常相似.在树形结构中最重要的就是二叉树,很多经典的算法与数据结构其实都是通过二叉树发展而来。:除最后一层外,其他的结点个数必须达到最大,并且最后一层结点都连续靠左排列。3.子树:当结点大于1时,其余的结点分为的互不相交的集合称为子树。6.孩子:结点的子树的根称为孩子结点。:B树(B-Tree,B+Tree)
2023-09-08 20:28:48
167
原创 数据结构与算法之贪心&动态规划
所以往往动归是一定能求出最优解的,而贪心不一定,这也是贪心算法的缺点,但是大家都看到了动归的时间复杂度是O(n*m)而贪心是O(nlogn),所以贪心算法的是高效的,动归如果子问题太多的话 就容易算不出结果,而且能用动归的问题往往用贪心都能解决一部分,甚至很大一部分。当袋子为2kg时,我们发现物品2可以装下去,此时可以得到10块钱,之前物品1进来时2kg最大是6吧,那我们肯定要选择大的这个10,而不是6.此时袋子还剩0kg可以装。袋子为5kg时,物品3可以转进来,得到12块钱,袋子还剩1kg。
2023-09-06 20:43:26
481
原创 数据结构与算法-选择&冒泡&快排&计数
一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。但选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。3.分析空间: 综上所述,没有一个固定的排序算法,都是要根据情况分析的。1. 在交换的时候会需要第三方变量,会占空间,所以可以用。进行排序:什么样的情况下不做任何交换了呢,那就是所有的数都在它应该在的位置;(1)归并排序的处理过程是由下到上的,先处理子问题,然后再合并。(2)快排其实就是从上到下,先分区,在处理子问题,不用合并。
2023-09-05 16:57:19
395
1
原创 数据结构与算法-插入&希尔&归并
来看一个具体的过程: 按照一个增量分段:add=n/2 n=10 =>5,2,1 7 8 9 0 4 3 1 2 5 10 我们取的这个增量分别就是5 2 1 7 8 9 0 4 3 1 2 5 10:分出来的数组元素都是一样的 完成一次排序: 3 1 2 0 4 7 8 9 5 3 2 4 8 5:取增量为2的分为一组了 最后一次我们就取增量为1的分组: 就是一个完整的序列,但是时间复杂度还是O(n^2)随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
2023-09-04 16:29:02
735
1
原创 数据结构与算法-递归回溯分治
1.递归的定义: 递归是一个非常重要的算法思想,应用也是相当的广泛,包括我们后面学的数据结构尤其是树形结构里面跟递归是密不可分的。所以大家是一定要学懂它的,其实递归说起来很简单,生活中也是经常可以碰到这个场景。比如我们在某窗口排队人太多了,我不知道我排在第几个,那么我就问我前面的人排第几个, 因为知道他排第几我就知道我是第几了。但前面的人也不知道自己排第几那怎么办呢?他也可以继续往前面问,直到问到第一个人,然后从第一个人一直传到我这里 我就很清楚的知道我是第几了。以上这个场景就是一个典型的递归。
2023-08-31 12:22:38
84
原创 实战分享之springboot+easypoi快速业务集成
另外需要修改excel导出颜色的话可以修改官方提供的接口。3.Controller层直接调用。2.封装easypoi工具类。
2023-08-24 23:44:46
768
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人