- 博客(61)
- 收藏
- 关注
原创 面试题(3)
Java集合框架是Java中用来存储,操作,管理对象的一种架构,分为单列集合和双列集合,其中单列集合中只能存放单个对象,顶层接口是Collenction,它有三个子接口,分别是list,set,queue.双列集合是按照键值对进行存储对象的,key必须是唯一的,但是value可以不唯一,顶级接口为Map,他没有子接口,只有一些实现类。
2025-03-22 19:42:00
658
原创 有序表--跳表
当进行增加节点时,比较难以维护的时指针的长度,例如第4层的a节点到f节点指针长度时40(底层跨过了40个节点长度),此时要在第四层a和f之间插入节点g,总的节点数好说,为41长度,但是a到g,g到f不能够直接得出,需要下层节点的返回值,因此在设计增加节点的函数时,需要一个返回值用来表明从i号节点出发,直到把空间编号为j的节点插入,底层总共有多少数字比key[j]小。对于寻找排名,如果当前节点比它小,一直往右划,以及统计指针的长度,直到找到比他小的最大值,然后往下跳,直到第一层,统计完总的个数。
2025-03-15 12:14:10
509
原创 Spring源码解析(6)
SpringAOP底层AnnotationAwareAspectJAutoProxyCreator的BeanPostProcessor来产生代理对象的。那么BeanPostProcessor是如何帮助进行代理对象的产生。
2025-03-14 18:26:30
283
原创 Spring源码解析(5)
Aop思想的核心:动态代理思想的应用,涉及到的设计模式是。代理设计模式就是通过代理类为目标类进行额外功能的开发,这样设计的好处:解耦合,利于原始类的维护。代理设计模式vs装饰器设计模式实现方式@EnableAspectJAutoProxy启用注解的Aop支持目前是通过代理对象的产生,对于切点方法的增强,因此UserService是一个代理对象,
2025-03-14 15:14:50
660
原创 面试题(二)--Object中的常见方法
对于Integer来说,像Integer a == 100这样的,是通过集中装箱(Integer.valueOf(100))进行创建,在Integer中缓存默认是-128~127,在这个范围内,a和b指向的是同一对象,因此a==b是true,c和d不在这个范围内,那么就是两个不同的对象,因此c==d是false.用于比较两个对象的是否一致,默认比较的是地址,为什么是地址呢?在equals的源码中,用的是“==”进行两个对象的比较,而“==”在比较对象(引用数据类型)的时候,就是比较对象的地址是否相同。
2025-03-09 20:40:30
822
原创 SpringBoot知识点及其源码解析(3)
总结:首先获取handler,获取后需要处理器和解析器进行处理,获取处理器和适配器成功后调用handle放进行处理,里面拿到参数解析器和返回值处理器,进行循环27个参数解析器,获取最适合解析的参数解析器,看参数是否存在某个注解,其中的@PathVariable是将参数放到map集合中,key是参数名称,通过key寻找value参数值。在invokeHandlerMethod方法中,首先是获取参数解析器课返回值处理器,然后在进行处理。对handle进行处理,返回值是ModelAndView。
2025-03-08 15:27:11
650
原创 springboot知识点以及源码解析(2)
springboot对静态资源的映射规则:在类路径下面定义目录static或public或resources或者META-INF/resources,访问时项目根目录+静态资源的名称在springboot中,如果项目中存在同名的静态资源和同名的动态资源。那么我们会优先去访问动态资源,如果动态资源不存在,然后再去访问对应的静态资源,如果静态资源也找不到,那么就报404 的异常 ,为了解决这个问题。
2025-03-08 01:39:33
811
原创 SpringBoot知识点及其源码解析(1)
以web启动器为例,在spring-boot-starter-test-3.4.3.pom文件整合了一系列的依赖,那么当启动程序后会不会进行自动配置?当获取到这个容器后,可以从容器中获取所有bean的名字,此时就可以在控制台发现很多bean的名称,都是自动配置进来的。
2025-03-07 12:01:59
865
原创 Spring源码解析(4)
循环依赖时两个对象相互引用,要解决循环依赖,两个对象必须是单例对象,并且属性是基于set方法注入。如果率先创建A对象,首先尝试通过getBean里的getSingleton获取对象A,由于对象A第一次创建,所以这里获取不到,所以这里只能调用doCreateBean方法进行对象A的创建,基于反射机制。
2025-03-07 00:28:54
826
原创 仿12306项目(5)
之前完成了核心功能--购票业务,现在需要考虑到并不是一台设备去买票,还要有其他其他的设备一起买票,现在有A~G共七台设备购票1张,现在库存是2,它们同时读到库存是2,可以进行购买,从而进行购票操作,由于票不够卖,那么此时就会发生超卖。那么如何解决呢?可以想到,在一个时间段内,只要有一个线程进入购票界面就行了。首先想到的是在购票方法上加synchronized,它可以解决单机多线程的超卖问题,但是这样子在多节点下还是会发生超卖,以及售票的效率比较低。哪还有什么办法呢?
2025-03-05 18:54:16
744
原创 仿12306项目(4)
对于乘客购票来说,需要有每一个车次的余票信息,展示给乘客,供乘客选择,因此首个功能是余票的初始化,之后是余票查询,这两个都是控台端。对于会员端的购票,需要有余票查询以及乘客的选择,不仅仅支持给自己买票,还可以给其他人买票,而且还可以选择座位类型,是一等座还是二等座,可以选择座位,最后是下单购票。
2025-03-04 18:04:06
1416
原创 线程池--深入一些
可以对于任务进行优先级的排序,根据任务的优先级来决定那些任务保留,那些任务丢弃。如果当前任务的优先级高于队列的最低优先级,那么那么就移除队列中的最低优先级任务,并重新提交当前的任务,否则的话,就丢弃当前的任务。任务的优先级应该如何设计?固定优先级,例如在电商的场景中,可以使vip用户订单的优先级高于普通用户订单优先级,普通用户的优先级高于促销活动日志的优先级。可以长时间未完成任务的线程逐步提升优先级,防止被淘汰。
2025-03-01 15:43:49
950
原创 仿12306购票系统(3)
前面完成了乘车人登录功能的实现,本篇主要是控制台方面的管理对于整体的控制台的设计,为了能够快速的检验,不进行登录拦截,在控制台的这个模块的controller层增加admin,以及在登录界面的拦截器排除掉admin.
2025-02-26 20:45:59
2326
原创 Spring源码解析(3)
doGetBean()是获取(创建)bean,首先获取bean的名称,有transformedBeanName进行处理,之后从缓存中获取spring之前创建的对象,获取到普通的bean直接返回,如果实现了FactoryBean接口,就需要转换。有两个值得关注的属性,一个是name,就是bean的名称,另一个是requiredType,就是预期要得到bean的类型。else主要是当子容器想要获取信息时,如果父容器有bean,子容器没有,从父容器获取bean,如果子父容器都有,从子容器获取bean,
2025-02-26 17:27:43
854
原创 Spring源码解析(2)
对于第一个问题,parseBeanDefinitionElement方法中,首先获取bean标签的id属性,之后获取bean标签的name属性,如果name属性不为空,就将获取的name字符串按照,或者;方式分割成数组,如果bean标签id属性不存在,name属性存在,就把第一个name属性拿出来作为bbean的id,之后进行校验bean的id是否唯一,并真正的开始解析bean的标签属性,在如下方法中。
2025-02-26 15:13:55
1046
原创 仿12306项目(1)
为了高效的生成有序且唯一的ID,可以采用雪花算法来进行实现,为什么不去采用UUID呢?首先,UUID是一个128位的值,相较于雪花算法生成的64位的值,长了很多,在数据库中存储时耗费的时间更长,UUID生成后没有顺序关系,导致它不适合做主键,雪花算法排序具有可读性,在一些状况下更容易地追踪。
2025-02-25 19:31:31
945
原创 Spring源码解析(1)
从BeanFactory说起其中,BeanFactory是整个bean工厂的顶级接口,里面定义了容器最基本的约束和规范,提供了管理Bean的基本功能。例如这里有根据名称获取Bean:Object getBean(String name),根据类型获取Bean:<T> T getBean(Class<T> requiredType),判断是否是单例Bean:boolean isSingleton(String name),判断是否是多例Bean:boolean isPrototype(String name)
2025-02-25 17:35:31
1046
原创 轮子项目--消息队列的实现(五)
此时需要创建DiskDataCenter类,让它持有上面的两个成员,即DataBaseManager和MessageFileManager,这里类要做的就是对于上面的方法进行封装,即对交换机,队列,绑定和消息这四者中的增加,删除和查找方法进行封装,以后上层操作硬盘的时候,就不必进入到DataBaseManager和MessageFileManager这两个类中,直接是进入是在DiskDataCenter类中进行调用对应的方法。,直接使用HashMap,key是name,value是Exchange对象,
2025-02-18 14:37:35
542
原创 网络部分的学习
网络上传输的数据,无论是光信号,电信号和电磁波,他们的本质都是一串二进制的数字,那么主机在网络上进行通信时就要约定好这些二进制传输的到底是什么意思,这个就是“网络通信协议的要完成工作”,由于网络通信是非常复杂的事情,如果使用一个协议,约定网络的所以的通信细节,就会导致这个协议非常的庞大,因此就把这个大的协议拆分成几个小的协议,每个小的协议专注于一类问题,让它们之间相互配合,完成整个网络通信的流程。把结构化的数据转为二进制的字符串,这个过程称之为序列化,把二进制的字符串转化为结构化的数据称之为反序列化。
2025-02-14 15:28:07
478
原创 轮子项目--消息队列的实现(3)
常用是@Autowired,但是前提是外面的类是一个注册在spring中的对象,但是现在并不打算让类是一个Bean对象,因为后面还需要手动进行管理,然后构造整体的结构,因此此时不可以用@Autowired,需要手动的构造。第二个参数,用来描述当前 json 字符串, 要转成的 java 对象是什么类型的.如果是个简单类型,直接使用对应类型的类对象即可,如果是集合类这样的复杂类型,可以使用 TypeReference 匿名内部类对象,来描述复杂类型的具体信息,(通过泛型参数来描述的)
2025-02-11 23:19:35
969
原创 轮子项目--消息队列的实现(2)
关于消息队列的核心概念有以下几个:交换机(Exchange),队列(MSGqueue),绑定(Binding)以及消息(Message),由于客户端不关心上面这些,只是把当前的数据发送到Broker Server中,再由Broker Server去处理这些数据,具体如何处理,由Broker Server决定,所以上述这些放到Broker Server中。因此就需要在mqserver包中的core包创建相关的核心类。
2025-02-11 19:13:29
931
原创 轮子项目--消息队列的实现(1)
什么是消息队列?从阻塞队列开始讲起,阻塞队列支持在环境下安全的进行操作,主要特性是当一个线程尝试对一个空的队列执行删除操作时,这个线程将会被阻塞,直到队列中有了可供处理的元素;同样,如果一个线程尝试向一个满的队列添加元素时,该线程也会被阻塞,直到队列中有可用的空间。这种机制简化了问题的实现。那么所谓的消息队列,就是把阻塞队列这样的数据结构,单独提取成一个程序,独立进行部署。
2025-02-10 22:58:45
1071
原创 字符串哈希原理
试想一下,如果对两个字符串进行是否为相同字符串的比较,如果是按照从前到后一个一个字符进行比较的话,如果字符串很长,那么消耗的时间就比较多。那么如果我们将不同的字符串转化为不同的有限位的数字,那么不就很好了吗,这就是今天要引出的哈希函数。哈希函数就是把复杂样本变成数字,以后复杂样本的对比变成数字之间的对比。如何理解性质4,有一个100m的绳子,范围是0~2^32-1,1000个不同的输入值经过哈希函数计算后,拿一个10m的绳子在范围内随便套,几乎是接近100个散落在这个范围的数字。
2025-02-10 15:49:45
820
原创 算法通关--带权并查集
我们知道,并查集可以维护两个点是否是在同一个组内,那么带权并查集不仅有并查集的特征,还有任意集合内任意两点之间的关系,其中最为典型的是a距离b为100,代表a在b的右边100个单位距离,c距离d为-20,代表c在d的左边20个单位的距离,现在,我们并不知道a与c,a与d点之间的距离关系。
2025-02-10 00:50:33
1112
原创 Morris遍历
是的,首先对于没有左子树的节点,计算它们时不需要向下访问,只需要对有左子树的节点进行向下两次访问,都是找左子树的最右节点,这样子可以得出二叉树上的节点被访问2次,2是个常数,因此时间复杂度为O(N)。首先要明确求当前节点在那一层,根据Morris遍历,树上的节点要么是从父节点到达,要么是从左子树的最右节点来的。因为有左子树就有左子树的最右节点,最右节点指向空时,就让其指向cur,进行“搭桥”,为第二次的访问做准备,但是如果没有左子树,遍历过程不会回到该节点,因此就不会再次访问到cur节点,所以到达一次。
2024-11-15 16:39:28
1010
1
原创 java中的定时器
在Java中,定时器用于在预定的时间执行任务,两种方式可以实现定时功能:Timer和TimerTask类,还有ScheduledExecutorService接口。
2024-11-14 20:29:22
1866
原创 Java中的线程池
线程池的出现主要解决在多线程编程中频繁创建和销毁线程所带来的问题。引入线程池的原因:1为了解决上述问题,线程池应运而生。线程池通过预先创建一定量的线程,在需要时进行重复使用,,简化了线程的管理。
2024-11-12 20:03:01
824
1
原创 线段树专题(1)
线段树可以维护的信息类型,父范围上的某个信息,可以用O(1)的时间,从子范围的信息加工得到,例如求某个范围的最大最小值,给某个范围每个位置加相同的数字,进行求和。0到2范围上的最大值是5,3到5范围上的最大值是7,如果求0到5范围的最大值,就是5和7进行比较,这样子就很快。已知2到4范围上的和是15,那么给这三个位置的值都增加2,那么和就是15+2*3=21,也很快;那么还有一些不能够被维护的信息类型,例如:某个范围出现次数最多的数字。
2024-11-09 20:09:02
786
原创 算法通关(4)-- 前缀树
前缀树(Trie树),也称为字典树,是一种用于的数据结构。它是一种树形结构,能够利用字符串的公共前缀来减少存储空间和查询时间。现在有“acb”,"cba","acc","ac"四个字符串,利用这四个字符串构出一颗前缀树。根节点不包含任何字符,是所有字符串的公共前缀;每个节点包含pass信息,代表加节点的时候路过了几次,还有一个end信息表示多少个字符串是以当前字符串结尾的。举个例子:插入完成后得到的树形结构:那么现在问:字符串acb出现了几次。
2024-11-07 21:02:56
1087
原创 算法通关(3) -- kmp算法
先知道是怎么回事就行用s2去匹配s1,next数组是对于s2来说的;含义:不包含当前,它前面字符串前缀和后缀最大匹配长度,也不能包含整体:例如前面的字符串abc,如果包含整体,abc一定匹配abc,没有了意义.对于0位置的a来说,它的前缀什么都没有,因此放一个-1表示不存在;对于1位置的a来说,前面有一个a,但是只有一个字母,不能够进行匹配,匹配则违反了包含整体(此时整体只有一个1),因此1位置是0;对于2位置b来说,前面是aa,前缀一个a,后缀一个a,刚好匹配,因此填1;
2024-11-07 13:40:18
893
原创 进程与线程的初探
现代的操作系统需要运行各种各样的程序。为了管理这些程序的运行,操作系统提出了进程(process)的抽象:每一个进程对应一个运行中的程序。进程进程的状态为了对进程进行管理,操作系统定义了进程的状态。新生状态:进程刚刚被创建处理,还未完成初始化。就绪状态:进程可以被调度执行,但是还没有被。
2024-11-03 12:58:43
715
原创 算法通关(2)--单调队列
为什么这样子的构造。淘汰的情况:[1,2,1,6,7,2,1,5,3],前缀和:[1,2,4,10,17,19,20,25,28],假设要满足子序列和12,前缀和1,2,4,10进入,当17进入是满足条件,而且淘汰掉1和2得到的和为14,也满足条件,长度为3,比原先的长度为5要短,加入前缀和17... 算最短的长度。这样子的大体思路出来了。)2位置的4进入,(max=5),3位置的6进入前,弹出2位置的4,0位置的5,(max=6),4位置的7进入前,弹出4位置的6,(max=7),5位置的1直接进。
2024-10-24 18:19:46
993
原创 算法通关--单调栈
单调栈是在栈的先进后出的规则基础上,要求从栈底到栈顶的元素满足单调的关系。如果是大压小,那么从栈顶观察是递减栈,如果是小压大,那么从栈顶观察使递减栈。
2024-10-24 15:09:35
936
原创 优先级队列和PriorityQueue
优先级队列是一种特殊的队列,每个元素都有一个优先级或者权重,与普通队列的先进先出不同,它按照优先级的大小从高到低进行排序,优先级最高的优先出队列。在任务调度,事件模拟中发挥着重要的作用。Java中的优先级队列是一种利用堆这种数据结构进行实现,按照数据的优先级顺序进行排序,可以任意的顺序插入,但是取出时按照规定好的优先级进行操作。
2024-10-17 20:13:01
853
1
原创 认识Java的异常
在实际的开发中,Java中的异常不能完全表示遇到的一些异常,这是就需要自定义一些异常类来满足开发的需求。我们根据空指针异常的源码对于自定义异常进行仿写super(s);super(s);那么总的实现是:if(!throw new userNameException("用户名错误!");if(!throw new PassWordException("密码错误!");System.out.println("登录成功!");try {
2024-10-16 17:17:04
616
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人