- 博客(21)
- 收藏
- 关注
原创 快速了解SpringBoot 统一功能处理
1. 添加拦截器后,执⾏Controller的⽅法之前,请求会先被拦截器拦截住.执⾏ preHandle() ⽅法, 这个⽅法需要返回⼀个布尔类型的值.如果返回true,就表⽰放⾏本次操作,继续访问controller中的 ⽅法.如果返回false,则不会放⾏(controller中的⽅法也不会执⾏).⽐如我们去银⾏办理业务,在办理业务前后,就可以加⼀些拦截操作 办理业务之前,先取号,如果带⾝份证了就取号成功 业务办理结束,给业务办理⼈员的服务进⾏评价. 这些就是"拦截器"做的⼯作.
2024-11-11 08:59:38
645
3
原创 布隆过滤器
比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其他元素的比 特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。布隆过滤器是由布隆(Burton Howard Bloom)提出,布隆过滤器是一种紧凑型,概率型数据结构,特点是可以高效的插入和查询元素,布隆过滤器可以告诉你“元素可能存在和一定不存在”,通过多种哈希数将元素映射到位图中,此种方式不仅可以提升查询效率,也可以节省大量的空间。5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能。
2024-11-11 08:52:36
2029
4
原创 交换排序与快速排序
3、在走的过程中,若end遇到小于key的数,则停下,begin开始走,直到begin遇到一个大于key的 数时,将begin和right的内容交换,end再次开始走,如此进行下去,直到begin和end最终相遇,此 时将相遇点的内容与key交换即可。基本思想: 所谓交换,就是根据序列中元素值进行比较,根据比较结果对两个数据进行位置的相互交换序列中的位置,交换特点:将键值大的元素向序列尾部移动或将键值小的元素向序列的前部移动。4.此时key的左边都是小于key的数,key的右边都是大于key的数。
2024-11-05 16:30:07
966
2
原创 细讲网络通信之五元组
问题:有了IP地址和端口号,就可以定位到网络主机的进程位置了,但是还有一个问题,就是网络数据传输的数据类型有很多种:图片,文本,视频等的不同数据形式,即使同一类型,但数据格式也可能不同,所以如何解决该问题呢?基于网络数据传输,需要使用协议来规定双方的数据形式。127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1 本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于 开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
2024-11-05 16:14:58
2228
原创 常见插入排序算法的实现(直接插入排序与希尔排序)
直到所有的记录插入完为止,得到 一个新的有序序列。直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到 一个新的有序序列。然后,取,重复上述分组和排序的工作。希尔排序与直接插入排序的关系:希尔排序可以说是对直接插入排序的优化,可以想象一下,如果是一个非常大数组且元素顺序混乱,如果直接使用插入排序的效率会非常低效,因为直接插入排序,非常受元素顺序的影响,元素顺序越有序,效率越高,反之,越低。
2024-11-04 14:45:56
622
1
原创 字符串的常量池
主要原因: 在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快,更节省内存,Java为8种基本数据类型和String类都提供了常量池。Intern一个native方法(底层功能的实现是使用C++ 完成的,所以无法查看源码),使用该方法可以将String对象 存放到常量池中。2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份。直接使用字符串常量进行赋值。
2024-11-04 14:36:00
281
原创 快速了解红黑树的插入和调整
红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O( ),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。2.检测新节点的插入是否违反了红黑色的性质,因为新节点的默认颜色为红色,因此如果插入的新节点的颜色是黑色,没有违反红黑树任何性质,则不需要 调整;// 性质三 , 由于性质三,调整后会形成性质二,所以性质三的判断先于性质二的判断。
2024-10-17 12:04:20
1007
2
原创 轻量级锁和重量级锁
可以想象为去饭堂打饭. 在窗口外的学生是用户态, 用户态的时间成本在一定程度上是可控的, 而窗口内, 工作人员就作为内核态 , 时间成本是不太可控的 , 如果打饭的时候反复和工作人员沟通, 还需要重新排队, 这时效率是很低的.开始是一个轻量级锁. 如果锁冲突比较严重, 就会变成重量级锁.重度依赖OS提供的mutex。", 这样的机制追根溯源是。大量的内核态用户态的切换。少量的内核态用户态的切换。简单理解 用户态和内核态。CPU 的原子指令,mutex 互斥锁.很容易引发线程的调度。不容易引发线程的调度。
2024-09-28 15:31:50
453
4
原创 乐观锁和悲观锁
同学 B 认为 "老师是比较闲的, 我来问问题, 老师大概率是有空解答的". 因此同学 B 直接就来找老师.(没 加锁, 直接访问资源) 如果老师确实比较闲, 那么直接问题就解决了. 如果老师这会确实很忙, 那么同学 B 也不会打扰老师, 就下次再来(虽然没加锁, 但是能识别出数据访问冲突). 这个是乐观锁.同学 A 认为 "老师是比较忙的, 我来问问题, 老师不一定有空解答". 因此同。, 初始使用乐观锁策略. 当发现锁竞争比较频繁的时候, 就会自动切换。,每次去拿数据的时候都认为别人会修改,
2024-09-28 15:01:41
269
原创 数据结构[Set]之快速了解
上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找往往复杂得多. 即动态查找,如果使用上述的查找方法就不太合适了, 所以程序员就引入了Map和Set , 更适合动态查找的容器.比如: 有一个英文词典,快速查找一个单词是否在词典中。快速查找某人的名字是否在通讯录中.Set与Map主要的不同有两点:Set是继承自。,其搜索的效率与其具体的实例化子类有关。Collection的接口类。Set中只存储了Key。
2024-09-24 17:18:43
444
原创 数据结构[Map]之快速了解
Mapset是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。常见的搜索方式有:直接插入法二分查找法上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找往往复杂得多. 即动态查找,如果使用上述的查找方法就不太合适了, 所以程序员就引入了Map和Set , 更适合动态查找的容器.
2024-09-24 16:28:00
517
原创 什么是门面模式(外观模式)
概念: 门面模式(Façade Pattern)又称为外观模式,提供一个统一接口,用于访问子系统的一群接口, 其主要特征是定义了一个高层接口,让子系统更容易被使用。
2024-09-20 15:31:56
349
1
原创 [多线程]阻塞队列的实现
阻塞队列是一种特殊的队列,但也遵循”先进先出”原则;阻塞队列是并且具有以下特性:但队列满的时候,继续入队列就会阻塞等待,直到其他线程从队列取出元素但队列空的时候,继续出队列就会阻塞等待,知道其他线程往队列添加元素阻塞队列的一个典型应用场景就是 "生产者消费者模型".
2024-09-20 09:00:00
511
原创 [面试高频问题]关于多线程的单例模式
什么是设计模式?设计模式可以看做为框架或者是围棋中的”棋谱”, 红方当头炮, 黑方马来跳. 根据一些固定的套路下,能保证局势不会吃亏.在日常的程序设计中, 往往有许多业务场景, 根据这些场景, 大佬们总结出了一些固定的套路. 按照这个套路来实现代码, 也不会吃亏.什么是单例模式, 保证某类在程序中只有一个实例, 而不会创建多份实例.单例模式具体的实现方式:可分为”懒汉模式”, ”饿汉模式”.
2024-09-15 09:00:00
1978
1
原创 快速认识多线程安全问题
我们可以这样子了解,我们把一段代码想象为去餐厅点菜吃饭并且只有一台机器进行点餐,此时每个线程就人,每个线程进行点菜,A线程先开始点餐,如果在A线程在点餐的过程中, B线程也可以参与点餐,此时就会导致A线程的点餐结果不同, 这就说明点餐是不具有原子性的.如果将点餐的流程封装为一个”动作”,即需要等前一个线程完成点餐后,后一个线程才能进行这个”点餐动作”,这样就保证了”点餐动作”这段代码的原子性了.在Java语句中一条Java语句不一定的原子性的,也不一定是一条指令。
2024-09-12 21:35:06
1053
2
原创 AVL树(二叉平衡搜索树)
AVL树是二叉查找树的扩展之一, 它的出现是为了弥补二叉搜索树的不足。二叉搜索树的缺点:二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。
2024-09-12 16:33:11
1013
原创 快速了解多线程的wait与notify
由于线程与线程之间是抢占式执行是, 因此线程之间的执行顺序是无法预测的, 但有时候又希望可以合理的协调线程之间的先后执行顺序, 所以想完成这个协调工作, 主要涉及到三个方法.wait的作用使当前执行代码的线程进入等待;释放当前锁;当满足一定条件时会被唤醒,重新获取释放的锁;其他线程调用该对象的notify方法;Wait等待时间超时(wait方法提供了一个带有时间参数的方法,可以指定等待时间);
2024-09-11 14:33:14
828
原创 LinkedList与链表
LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,通过引用将节点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。在集合框架中, LinkedList也实现了List接口,具体如下ArrayList和LinkedList的区别[总结]ArrayList和LinkedList两者之间各有优点ArrayList: 基于顺序表实现, 支持快速的随机访问(get和set操作),因为可以直接通过索引访问元素,无需遍历。
2024-09-06 11:53:03
429
1
原创 Array List与顺序表
在集合框架中 ArrayList是一个普通类, 实现了List接口【说明】1. ArrayList是以泛型方式实现的,使用时必须要先实例化2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。
2024-09-04 22:38:29
1855
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅