- 博客(73)
- 资源 (1)
- 收藏
- 关注
原创 有向图-拓扑排序
拓扑排序leetcode上的题目:课程表参考题解:https://leetcode-cn.com/problems/course-schedule/solution/course-schedule-tuo-bu-pai-xu-bfsdfsliang-chong-fa/解题思路:本题可约化为: 课程安排图是否是 有向无环图(DAG)。即课程间规定了前置条件,但不能构成任何环路,否则课程前置条件将不成立。思路是通过 拓扑排序 判断此课程安排图是否是 有向无环图(DAG) 。 拓扑排序原理: 对 DA
2022-04-11 19:48:40
791
原创 ArrayBlockingQueue源码(JDK1.8)
文章目录成员变量构造函数入队方法出队方法总结在手写线程池的时候,发现BlockingQueue非常重要,遂查看了BlockingQueue的源码,记录在此。Java.util.concurrent.BlockingQueue接口有以下阻塞队列的实现,基于ReentrantLock:FIFO队列:LinkedBlockingQueue、ArrayBlockingQueue(固定长度)优先级队列:PriorityBlockingQueue(看到优先级就应该想到大小堆)提供了阻塞的take()和
2022-04-10 16:12:23
609
原创 字节四面-暑期实习后端开发
文章目录字节一面字节二面字节三面字节四面流程:3.2内推,3.3收到一面通知,无笔试3.8号一面,次日hr发邮件通过3.17二面,次日hr发邮件通过3.23三面,3.25hr通知三面过4.1hr通知加面,4.6四面吐槽字节面试流程都说字节流程快,一般三面拿到offer,甚至两面,为撒我这么倒霉。。。3.2投的简历一周一面,本以为三面完了就可以收到offer了,结果三面过了两天收到hr电话(通知三面过了)约定下周一二商谈,结果直接放鸽子,打电话过去催了一下一直让等,等到周五忍不住让内推
2022-04-09 21:56:55
856
原创 SQL注入
文章目录攻击思路实例演示防御办法概念:针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。攻击思路寻找到SQL注入的位置判断服务器类型和后台数据库类型针对不同服务器和数据库特点进行SQL注入攻击实例演示数据库表字段:表中数据:手写SQL演示注入攻击1、获取这张表的所有数据,只需要保证上面sql的where条件恒真就可以,客户端传参如果不经校验就会导致这种结果。2、查询mysql版本号,使用union拼接sql3、查询数据库名4、查询当前用户的所有库
2022-04-02 11:33:41
5201
原创 分布式缓存
文章目录哈希取余分区一致性哈希一致性哈希环节点映射容错性扩展性数据倾斜问题哈希槽使用Docker搭建三主三从分布式缓存,由于有多个Redis需要算法来确定数据存放在哪个Redis中,一般有三种算法:哈希取余,一致性哈希,哈希槽。除此之外,为防止Redis宕机产生数据丢失的情况,使用主从复制的方式给每个主节点配置一个从节点。哈希取余分区定义:hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。优点:简单有效,只需预估好数据规划好节点,就能保证一段时间的数据支撑。
2022-04-01 10:47:51
1057
原创 前缀和应用
文章目录一维前缀和二维前缀和定义:前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。前缀和分为一维前缀和,以及二维前缀和。前缀和是一种重要的预处理,能够降低算法的时间复杂度。一维前缀和一维前缀和的公式:sum[i] = sum[i-1] + arr[i] ; sum是前缀和数组, arr是内容数组。拥有前缀和数组后, 我们可以在O(1)的时间复杂度内求出区间和。[i, j]的区间和公式: interval [i, j] = sum[j] - sum[i - 1]leetcode:和为K
2022-03-31 21:41:04
487
原创 Docker知识点总结
文章目录Docker三要素Docker基础指令帮助启动类命令镜像命令容器命令数据卷DockerFileDockerFile构建镜像过程解析DockerFile常见保留字指令Docker网络常用命令网络模式bridgehostnonecontainer自定义网络容器编排Docker三要素镜像:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例
2022-03-27 22:49:18
2371
原创 差分数组-生存人数
文章目录使用场景差分数组原理总结刷leetcode碰到生存人数一题,有使用差分数组进行求解的,看到很多题解都是直接贴代码,没有差分数组原理的讲解,看的云里雾里的,遂查了一下差分数组的原理和使用场景,茅塞顿开!!题目:生存人数代码:public int maxAliveYear(int[] birth, int[] death) { int[] dp = new int[102]; for (int i = 0; i < birth.length; ++i) {
2022-03-15 11:52:32
1740
原创 synchronized,wait,notify使用案例
synchronized,wait,notify使用案例案例一:两个线程交替打印1-100public class PrintOneHundred { public static void main(String[] args) { Number number=new Number(); Thread th1=new Thread(number,"线程一"); Thread th2=new Thread(number,"线程二"); th1.start(); th2.start(
2022-03-10 17:14:54
383
原创 基于SpringBoot、Redis和RabbitMQ的秒杀系统
基于SpringBoot、Redis和RabbitMQ的秒杀系统文章目录基于SpringBoot、Redis和RabbitMQ的秒杀系统登录功能总结一、两次MD5加密二、参数校验三、记录用户信息四、分布式Session4.1、Spring Session配合Redis实现分布式Session4.2、直接将用户信息存入Redis五、优化登录功能秒杀系统解决的主要问题:并发读、并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据;并发写的处理原则也一样,它要求我们在数据库
2021-11-10 21:26:18
2965
1
原创 Java泛型
文章目录一、泛型的定义和意义二、特性三、泛型的使用3.1、泛型类3.2、泛型接口3.3、泛型方法四、限定泛型类型变量五、通配符一、泛型的定义和意义泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。设想如下场景:如果要实现不同类型的加法,每种类型都需要重载一个add方法,有没有可能只实现一个方法就可以解决类型不同的参数相加?取出集合元素时需要人为的强制类型转化到具体的目标
2021-07-20 17:10:31
141
原创 PriorityQueue(Java优先级队列)
刷LeetCode时,遇到一道题需要使用优先级队列,并且需要自定义排序规则,由于优先级队列使用并不多,遂做一下笔记,方便以后查看。优先级队列实际上就是一个堆(不指定Comparator时默认为小根堆),队列既可以根据元素的自然顺序来排序,也可以根据 Comparator来设置排序规则。具有以下特点:队列是用数组实现,但是数组大小可以动态增加,容量无限。不是线程安全的。保证线程安全可以使用PriorityBlockingQueue 类。不允许使用 null 元素。可以在构造函数中指定如何排序.
2021-07-08 19:29:44
1116
原创 强化学习之Q-Learning
算法步骤完整的算法步骤:以任意的方式初始化所有的Q(s,a)。对于每个episode,初始化一个初始状态s。重复以下步骤:利用当前的Q值,得到更新的策略π。有了策略就可以根据策略和状态s选择a。执行当前的行为a,观察汇报R和下一个状态s’。用推导的策略选择s’对应的行为a’。更新,Q(s,a)=Q(s,a)+α[R+γmaxa′Q(s′,a′)−Q(s,a)]Q(s,a)=Q(s,a)+\alpha[R+\gamma max_{a'}Q(s',a')-Q(s,a)]Q(s,a)=Q(s,
2021-07-01 19:12:48
453
原创 八大排序复杂度和稳定性
文章目录选择排序冒泡排序直接插入排序快速排序希尔排序归并排序堆排序基数排序总结选择排序印象最深的排序,第一个排序算法就是你!!就是把元素分成两部分,一部分是有序的,另外一部分是无序的;每次循环从无序的元素中选取一个元素放到有序的元素中,依次循环到最后把所有元素都放到了有序那一部分中(也就是无序部分,元素为零)。具体步骤:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。代码
2021-06-21 11:59:17
669
3
原创 设计模式之迭代器模式
在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如数据结构中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码。迭代器模式能较好地克服以上缺点,它在客户访问类与聚合类之间插入一个迭代器,这分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节。迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。应用场景当需要为聚合对象提供多种遍历方式时。当需要为遍.
2021-06-20 14:48:12
116
原创 设计模式之责任链模式
在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿.
2021-06-20 10:26:04
219
原创 Java钩子函数的应用
文章目录Hook概念Hook基本用法项目解决方法在自研RPC的框架中实现了服务的自动注册和发现,但是当你启动服务端后再把服务端关闭,Nacos中注册的服务信息并不会自动注销,这样就会导致客户端向Nacos请求服务时会获取已经关闭的服务端信息,最终导致连接不到服务器而调用失败。那么就需要一种办法,在服务端关闭之前自动向 Nacos 注销服务。但是有一个问题,不知道什么时候服务器会关闭,也就不知道这个方法调用的时机,就没有办法手工去调用。这时,我们就需要钩子,由此引出本文。Hook概念Hook翻译成
2021-06-20 09:48:49
1617
原创 设计模式之模板方法模式
一个人每天会起床、吃饭、做事、睡觉等,其中“做事”的内容每天可能不同。我们把这些规定了流程或格式的实例定义成模板,允许使用者根据自己的需求去更新它,例如,简历模板、论文模板、Word 中模板文件等。模板方法(Template Method)模式的定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。应用场景:算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。当多个.
2021-06-19 09:56:19
100
原创 设计模式之桥接模式
桥接(Bridge)模式的定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。应用场景:当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。模式组成:抽象化角色:定义抽象类,并包含一个对实现化对象的引用。扩展抽象化角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系
2021-06-18 10:45:43
182
2
原创 设计模式之适配器模式
适配器模式(Adapter)的定义:将一个类的接口转换成另外一个接口,使得原本不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求对现有组件库中的相关组件的内部结构比较了解,所以应用相对较少些。应用场景:以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。模式组成:目标接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者类:它是被访问和适配
2021-06-18 09:20:59
109
原创 设计模式之代理模式
代理模式的定义:给某对象提供一个代理以控制对该对象的访问。这时,访问对象不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。应用场景:远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的
2021-06-17 19:03:09
90
原创 设计模式之建造者模式
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。例如lombok中@Builder使用了建造者模式。应用场景:相同的方法,不同的执行顺序,产生不同的结果。多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。初始化一
2021-06-17 14:15:24
102
原创 设计模式之工厂模式
文章目录简单工厂模式工厂方法模式抽象工厂模式工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式:把创建产品的对象称为工厂,被创建的对象称为产品。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式。工厂方法模式:是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品。抽象工厂模式:抽象工厂模式是工厂
2021-06-17 09:54:18
206
原创 设计模式之原型模式
文章目录优点和缺点应用场景原型模式的结构具体实现原型管理器原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用这种方式创建对象非常高效,根本无须知道对象创建的细节。优点和缺点原型模式的优点:Java自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状
2021-06-16 19:31:47
144
原创 设计模式之单例模式
文章目录优点和缺点应用场景单例模式的两种实现懒汉模式饿汉模式单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。单例模式有 3 个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。优点和缺点单例模式的优点:单例模式可以保证内存里只有一个实例,减少了内存的开销。可以避免对资源的多重占用。单例模式设置全局访问点,可以优化和共享资源的访问。单例模式的缺点:单例模式一般没有接口,扩展困
2021-06-16 14:56:12
101
原创 Netty中的责任链模式
责任链模式适用场景:对于一个请求来说,如果每个对象都有机会处理它,而且不明确到底是哪个对象会处理请求时,我们可以考虑使用责任链模式实现它,让请求从链的头部往后移动,直到链上的一个节点成功处理了它为止优点:发送者不需要知道自己发送的这个请求到底会被哪个对象处理掉,实现了发送者和接受者的解耦简化了发送者对象的设计可以动态的添加节点和删除节点缺点:所有的请求都从链的头部开始遍历,对性能有损耗极差的情况,不保证请求一定会被处理Netty中的应用netty的pipeline设计,就采用了责
2021-06-11 09:52:20
566
1
原创 捋一下log4j、logback和slf4j的关系
项目中经常使用日志,但都是参照别人的配置复制粘贴,这次碰到这几个名词产生疑惑,遂写下这篇笔记进行总结。结论官方文档中的一段话明确描述了三者的关系。slf4j译为简单日志门面,是日志框架的抽象,笼统的讲就是slf4j是一系列的日志接口,而log4j和logback是众多日志框架中的两种。The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging fra.
2021-06-07 14:22:14
679
转载 八、Netty简单RPC调用
文章目录1、RPC基本介绍2、代码示例本文档整理并出自尚硅谷韩顺平Netty教程https://www.bilibili.com/video/BV1DJ411m7NR1、RPC基本介绍RPC(Remote Procedure Call,远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程两个或多个应用程序都分布在不同的服务器上,它们之间的调用都像是本地方法调用一样(如图)常见的 RPC 框架有: 比较
2021-05-30 15:51:42
276
转载 七、TCP粘包和拆包
文章目录1、什么是拆包和粘包2、拆包、粘包的图解3、解决方案图解4、TCP粘包代码示例5、解决方案代码示例本文档整理并出自尚硅谷韩顺平Netty教程https://www.bilibili.com/video/BV1DJ411m7NR1、什么是拆包和粘包TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数
2021-05-30 15:42:44
302
转载 六、Netty的Handler
文章目录1、Handler介绍2、Handler链式调用3、Handler编解码器4、简单实例5、Log4j整合到Netty本文档整理并出自尚硅谷韩顺平Netty教程https://www.bilibili.com/video/BV1DJ411m7NR1、Handler介绍netty的组件设计:Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等我们先来复习一下ChannelHandler和Chan
2021-05-30 15:29:14
810
转载 五、GoogleProtobuf
文章目录1、编码与解码2、Protobuf简介3、proto文件格式4、Netty中使用Protobuf本文档整理并出自尚硅谷韩顺平Netty教程https://www.bilibili.com/video/BV1DJ411m7NR1、编码与解码编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据
2021-05-30 15:10:04
248
转载 四、Netty核心组成
文章目录1、Bootstrap、ServerBootstrap2、Future、ChannelFuture3、Channel4、Selector5、ChannelHandler及其实现类6、Pipeline和ChannelPipeline7、ChannelHandlerContext8、ChannelOption9、EventLoopGroup和其实现类NioEventLoopGroup10、Unpooled11、Netty群聊系统12、Netty心跳检测机制案例13、Netty建立Websocket连接1
2021-05-30 09:59:03
313
转载 三、Netty高性能架构设计
文章目录1、Netty概述1.1、原生NIO存在的问题1.2、Netty优点2、I/O线程模型2.1、传统阻塞I/O服务模型2.1.1、模型分析2.1.2、模型实现代码示例2.2、Reactor模型概述2.3、单Reactor单线程模式2.3.1、模型分析2.4、单Reactor多线程模型2.4.1、模型分析2.5、主从Reactor多线程2.5.1、模型分析3、Netty模型3.1、主从Reactor进阶3.2、再进阶版3.3、Netty模型3.4、代码示例3.5、任务队列3.6、异步模型3.7、快速入门
2021-05-28 09:22:38
161
转载 二、NIO详解
文章目录1、缓冲区(Buffer)1.1、基本介绍1.2、Buffer类介绍1.2.1、Buffer类主要属性1.2.2、Buffer类使用示例2、通道(Channel)2.1、基本介绍2.2、FileChannel类2.2.1、常见方法2.2.2、应用实例2.3、ServerSocketChannel 和 SocketChannel 类2.3.1、常见方法2.3.2、应用实例3、Selector(选择器)3.1、基本介绍3.2、SelectionKey介绍3.3、Selector常见方法4、Demo实例4
2021-05-27 16:30:05
528
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人