![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA语言学习
miss writer
我也可以成为大佬,为世界开源做贡献。冲!!!
展开
-
最详细的建立二叉树的代码【深搜和层次遍历实现】
采用深搜时:上述输入[5,4,8,11,null,null,13,4,7,2,null,null,null,null,5,1]采用层次时:上述输入[5,4,8,11,null,13,4,7,2,null,null,5,1]上述代码可以直接运行,举个例子说明输入。注意选取何种建树方法取决输入形式。原创 2024-07-16 21:55:56 · 178 阅读 · 0 评论 -
Spring注解的实现原理【简单实现一个注解】
注解本身是通过@interface关键字定义的一个特殊接口,使用反射API,如Class.getAnnotation()、Method.getAnnotation()等,可以获取到指定程序元素上的注解实例。当我们通过反射API获取注解时,实际上返回的是一个代理实例,这个代理实现了注解接口,并覆盖了接口中定义的所有方法。当这个注解被用在Java代码中时,它可以提供声明式的验证,使得代码更加清晰,易于维护。添加元注解:使用元注解(如@Target和@Retention)来定义注解的作用域和生命周期。原创 2024-07-16 18:58:47 · 264 阅读 · 0 评论 -
力扣207【课程表】
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。正确代码如下:按a->b记录边,同时记录每个节点的入度,判断是否可行时要求此节点的入度为0,同时以此节点为头的边界点入度减一,满足入度为0继续入队。先贴一下错误代码:(思路,使用map存储有入度的节点,将入度为0的点入队,出队的点为前置节点,遍历数组判断加入后置节点)你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。上述代码的问题,无法处理有环出现的情况。原创 2024-07-14 10:15:00 · 188 阅读 · 0 评论 -
动态代理实现AOP技术【代码演示】
AOP技术利⽤"横切"技术,剖解开封装的对象内部,并将那些影响了多个类的公共⾏为封装到⼀个可重⽤模块,并将其命名为"Aspect",即切⾯。所谓"切⾯",简单说就是那些与业务⽆关,却为业务模块共同调⽤的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。3、连接点(joinpoint) 被拦截到的点,因为Spring只⽀持⽅法类型的连接点,所以在Spring中连接点指的就是被截到的⽅法,实际上连接点还可以是字段或者构造器。2、切⾯就是对横切关注点的抽象。原创 2024-07-15 10:30:00 · 149 阅读 · 0 评论 -
作业帮笔试1【简单版接雨水】
已经做过接雨水的题解,本题略有不同,描述是给定一个数组,每个值代表对应坐标的高度,从中选择两个坐标,与x轴组成的容器能接最多的水。算法:使用双指针从两边选取,哪一边坐标低哪一边移动。每次计算结果与最大值对比。输入是字符串形式【1,2,3】需要自己转换成数组。原创 2024-07-12 20:59:08 · 189 阅读 · 0 评论 -
NIO(NO-Blocking I/O)模型
处理事件: 在⼀个循环中调⽤ Selector 的 select() ⽅法,该⽅法会阻塞直到⾄少⼀个注册的 Channel发⽣了感兴趣的事件。注册 Channel 到 Selector: 通过 Selector 监听⼀个或多个 Channel ,当 Channel 上发⽣感兴趣的事件时, Selector 将通知程序;Selectors(选择器):如果应用需要处理多个通道,选择器可以监控多个通道的 I/O 事件,如连接请求、数据到达等。Buffers(缓冲区):是数据容器,用于存储不同类型的数据。原创 2024-07-12 11:33:19 · 879 阅读 · 0 评论 -
7.10飞书一面面经
B+树的⾮叶⼦节点不存放实际的记录数据,仅存放索引,所以数据量相同的情况下,相⽐存储即存索引⼜存记录的 B 树,B+树的⾮叶⼦节点可以存放更多的索引,因此 B+ 树可以⽐ B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。主从复制:单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,可以搭建主从集群,实现读写分离。B+ 树有⼤量的冗余节点(所有⾮叶⼦节点都是冗余索引),这些冗余索引让 B+ 树在插⼊、删除的效率都更⾼,⽐如删除根节点的时候,不会像 B 树那样会发⽣复杂的树的变化;原创 2024-07-10 22:41:59 · 1302 阅读 · 0 评论 -
7.10飞书一面
面试官人很好,不断地帮助我代入状态,自己在知识点上面花的时间还不够,算法比较简单A了,找时间写下面经。首先,太紧张很多问题能答得更好,大脑混在一起,语音比较紊乱。算法:求一个数组的峰值(大于左右相邻元素即可)。2、优化,使用二分查找降低到logn复杂度。2、介绍一下Mysql的索引?说一下验证码实现验证的逻辑;3、说一下Redis集群。1、Redis为什么快?用到线程池是自己搭的吗?1、直接遍历进行比较。原创 2024-07-10 17:21:16 · 405 阅读 · 0 评论 -
力扣215 数组中第k大的数
算法:由于数组最大范围是10000,存在负数。申请一个20000的数组,将原数组的数作为新数组下标(+10000因为存在负数),然后从后往前减,求出第K大的数。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。本题主要考察各种排序算法,要求时间O(n),严格意义上说只有计数排序满足条件。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。原创 2024-07-10 11:04:17 · 307 阅读 · 0 评论 -
软件工程常见知识点
最终,选择最佳设计是一个权衡的过程。作为一名架构师,我们需要具备广泛的技术知识、敏锐的业务洞察力和良好的沟通能力,以确保系统能够满足用户和业务的需求。首先,模块化是我们的基石,通过将系统拆分成独立的、职责明确的模块,我们可以灵活地替换和升级各个部分,而不影响整个系统。在设计验证阶段,我们将组织设计评审会议,让团队成员和利益相关者对设计进行评审,并通过原型验证设计的可行性和有效性。其次,采用服务化架构,比如微服务,可以让我们按需扩展特定服务,而不必对整个系统进行扩展,这大大提高了资源利用率和系统的响应速度。原创 2024-07-08 21:59:31 · 2588 阅读 · 0 评论 -
力扣394 字符串解码
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。算法:使用栈模拟解码规则,遇到】就考虑最近的字符串次数,依次往最外层处理。给定一个经过编码的字符串,返回它解码后的字符串。原创 2024-07-08 15:27:03 · 139 阅读 · 0 评论 -
线程池实战【多线程实时转录语音】
对电话进行监听,有电话接入首先判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队 列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任 务。如果已经满了,则交给拒绝策略来处理这个任务。ThreadLocal用于在每个线程中存储独立的变量副本,这样每个线程都可以独立地访问和修改自己的变量副本,而不会相互干扰。原创 2024-07-07 17:20:09 · 242 阅读 · 0 评论 -
力扣128 最长连续序列
算法 通过HashSet对数组去重,判断这个元素是否有前置元素,如果有就不进行操作,因为它的前置元素求的最长序列一定比它长;如果没有判断这个元素作为头元素的最长序列;给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。最近在准备项目和八股文,更新的比较少,还是要继续保持更新。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。原创 2024-07-07 11:29:08 · 122 阅读 · 0 评论 -
安装Rabbitmq遇到的坑
不同的虚拟机unbontu、cetenos和不同的erlang和不同的rabbitmq之间要对应。分割线= =====================================安装好后,如果在虚拟机的服务器上可以打开,在本地浏览器无法打开rabbitmq。下面给出我的版本centos7+erlang+rabbitmq。显示在允许,关闭防火墙。原创 2024-07-01 16:41:30 · 261 阅读 · 0 评论 -
使用Token管理用户session
起因:单点登录问题,登录时访问的是tomcat1,访问获取用户数据时访问的是tomcat2,而用户的session信息在tomcat1上存储,tomcat2并不知道该用户来过,所以在获取个人信息时从session中获取不到数据,所以就显示该用户未登录。然后在doLogin方法中使用JwtUtil.generateToken(user)来生成Token,并将Token返回给客户端。原创 2024-06-28 20:31:28 · 564 阅读 · 0 评论 -
力扣32 最长有效括号
算法:使用栈进行模拟括号匹配,将可以匹配的括号对应位置置为0,求这个序列连续0的最长子序列长度。给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号。进一步优化,可以直接计算最长序列。原创 2024-06-25 21:49:54 · 290 阅读 · 0 评论 -
力扣43 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。算法:实际上就是模拟乘法,不同的是本题数值会超过long表示的最大范围。而123 * 5 = 100 * 5 + 2 * 5 + 3 * 5。第五个放入3 * 5,第四个放2 * 5 ,第三个放1 * 5。举例要求123*45 = 123 * 40 + 123 * 5。第四个加4 * 3,第三个加4 * 2,第二个加4 * 1。可证:N长度的数乘M长度的数,最长不超过N+M。原创 2024-06-25 20:04:06 · 235 阅读 · 0 评论 -
力扣155 最小栈引发的==的小问题
这就是为什么当Integer对象的值超过127时,使用==运算符比较这些对象会返回false的原因。设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。算法:使用两个栈分别存放数据、当前元素对应的栈里的最小值,将这两个栈进行同步。void push(int val) 将元素val推入堆栈。int getMin() 获取堆栈中的最小元素。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。MinStack() 初始化堆栈对象。原创 2024-06-24 17:09:47 · 347 阅读 · 0 评论 -
力扣78 子集
本题不难,但是长时间没做和全排列搞混淆了,这里不需要判断当前数是否在本次递归中是否使用,因为每次进递归都是从上次数的下一个进的。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的。算法:按数组顺序进行递归,每次的结果都保存下来,然后进行回溯继续递归。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。输入:nums = [1,2,3]原创 2024-06-24 11:36:02 · 227 阅读 · 0 评论 -
力扣105 根据先序和中序遍历结果建树
算法:根据提供的先序、中序序列可以唯一确定一颗二叉树,而通过函数可以每次根据提供的二叉树同一部分的两个序列建立这部分,从而使用递归完整的构建整棵树。原创 2024-06-24 11:26:30 · 210 阅读 · 0 评论 -
6.22面试问题【1】长链表排序选择归并还是快排
内存访问模式:快速排序的效率主要来源于引用的局部性,计算机硬件在这里得到了优化,因此访问彼此相邻的内存位置往往比访问分散在内存中的内存位置更快。然而,链表单元格经常分散在内存中,所以访问相邻的链表单元格没有局部性的好处。这在数组排序中是一个巨大的优势,因为分配和释放辅助数组所需的时间是显而易见的。然而,对于链表来说,归并排序的链表算法并不需要任何额外的辅助存储空间。排序效率:归并排序往往更快,因为它更平均地将列表一分为二,并且在每次迭代中进行归并比执行分区步骤所做的工作更少。先问快排和归并的思路?原创 2024-06-22 12:31:22 · 456 阅读 · 0 评论 -
76.最小覆盖子串
给你一个字符串 s 、一个字符串 t。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”。对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串,我们保证它是唯一的答案。原创 2024-06-21 21:11:40 · 257 阅读 · 0 评论 -
力扣41 缺失的正数
那第一个要解决的问题就是长度,这题答案其实只能在【1,length+1】中出现,因为但凡有一个位置不是这个范围内的数,那就必定有一个这个范围内的数没出现。解决了第一个长度问题,那就还有如何映射的问题,也就是我怎么知道范围里的数有没有出现过。那么最后没有变成负值的数,它对应的下标就是我们要找的范围里的数咯!这题最初的思路是用一个哈希表,将数组存入,然后从1开始找第一个哈希表中不存在的数就是缺失的正数。给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。解释:1 在数组中,但 2 没有。原创 2024-06-20 21:28:22 · 325 阅读 · 0 评论 -
使用ReentrantLock和ThreadPoolExecutor模拟抢课
为了简化示例,这里使用了 ReentrantLock来控制对 availableSeats 的访问,保证了线程安全。在实际应用中,可能需要更复杂的并发控制机制。在真实的抢课系统中,抢课的逻辑会更加复杂,需要考虑数据库的并发访问、事务处理、网络延迟等因素。这里主要是在场景下帮助理解ReentrantLock和线程池的使用。原创 2024-06-18 22:45:18 · 507 阅读 · 0 评论 -
ReentrantLock可重入锁
在并发量较⼩的多线程应⽤程序中,ReentrantLock与synchronized性能相差⽆⼏,但在⾼ 并发量的条件下,synchronized性能会迅速下降⼏⼗倍,⽽ReentrantLock的性能却能依然维持⼀个⽔ 准。ReentantLock继承接⼝Lock并实现了接⼝中定义的⽅法,除了能完成synchronized所能完成的所有⼯作 外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等避免多线程死锁的⽅法。可重⼊锁,这个锁可以被线程多次重复进⼊进⾏获取操作。原创 2024-06-18 21:09:30 · 222 阅读 · 0 评论 -
一文了解IO流
文件读写:这是IO流最常见的用途之一。例如,FileInputStream和FileOutputStream用于处理文件的二进制数据,而FileReader和FileWriter则用于处理字符数据。IO流根据处理数据的类型可以分为字节流(以InputStream和OutputStream为基础)和字符流(以Reader和Writer为基础)。管道通信:Java IO提供了管道相关的流(PipedInputStream和PipedOutputStream),允许在不同线程之间进行数据传输,实现线程间的通信。原创 2024-06-16 16:21:04 · 766 阅读 · 3 评论 -
力扣93 复原地址
算法:递归判断每次选择的数字符不符合要求,一共只能选择4次,字符串必须正好用完。建议参考官方题解,递归函数中参数不应该这么复杂。数据结构:数组+字符串+递归栈。原创 2024-06-14 16:28:50 · 125 阅读 · 0 评论 -
观察者设计模型【代码详解】
NewsAgency是一个具体的主题,它通知所有注册的观察者(如NewsChannel)状态改变(新闻更新)的消息。Pattern)是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。当主题对象的状态发生变化时,主题对象会遍历注册到它上面的所有观察者,并调用观察者的更新方法,以通知所有观察者状态已经改变。观察者在得到状态更新的通知后,可以相应地更新自己的状态或执行相应的操作。观察者模式的主要角色。观察者模式的工作原理。原创 2024-06-14 09:45:00 · 475 阅读 · 0 评论 -
代码详解工厂设计模式【2】
这样,如果未来需要添加更多类型的文档处理,我们只需添加相应的具体产品和工厂类,无需修改现有代码,从而达到了开闭原则的要求。暴露了简单工厂模式的一些局限性。在工厂方法模式中,我们为每种产品提供一个工厂类,这样就避免了在一个工厂类中集中所有产品的创建逻辑,同时也使得新增产品时不需要修改已有的工厂类,只需要添加新的具体工厂类即可。工厂方法模式通过这种方式,将对象的创建逻辑分散到了各个具体工厂类中,每个具体工厂类负责创建一种具体产品,这样就避免了简单工厂模式中的问题,提高了系统的扩展性和可维护性。原创 2024-06-13 19:29:34 · 613 阅读 · 0 评论 -
代码理解工厂模式【1】
在这个例子中,DocumentFactory是一个简单工厂,它根据传入的字符串参数决定创建哪种类型的文档对象。⼯⼚类集合了所有产品的创建逻辑,职责过重,同时新增⼀个产品就需要在原⼯⼚类内部添加⼀个分⽀,违反了开闭原则。在创建对象时,不会对客户端暴露对象的创建逻辑,⽽是通过使⽤共同的接⼝来创建对象。如果现在又有新产品进来,实现完产品后还要到简单工厂加入对应的逻辑代码,如果有很多新产品,那么这样的处理是不是太麻烦?⼀般情况下,⼯⼚模式分为三种更加细分的类型:简单⼯⼚、⼯⼚⽅法和抽象⼯⼚。原创 2024-06-13 19:19:47 · 483 阅读 · 0 评论 -
力扣42 接雨水
算法:核心是计算这一列接到多少雨水,它取决于它左边的最大值和右边的最大值,如下图第三根柱子能接到的雨水应该是第一根柱子高度和第五根柱子高度的最小值减去第三根柱子高度。听说字节每人都会接雨水,我也要会哈哈哈。原创 2024-06-12 11:48:24 · 390 阅读 · 0 评论 -
力扣143 重排链表
算法:使用数组保存链表的每个节点,按规律取出并重连链表。原创 2024-06-11 21:48:10 · 204 阅读 · 0 评论 -
力扣23 合并k个升序链表
算法:将链表中的数据先存入数组,然后建立小根堆,依次取出堆顶置于新链表。数据结构:小根堆+链表。原创 2024-06-07 16:28:56 · 266 阅读 · 2 评论 -
力扣54 螺旋矩阵【如何优雅的写好代码】
这题本质是二维数组的遍历,更多考察的是对写代码的基本功。建议先写好伪代码这样才不会乱,特别是对边界条件的把握。原创 2024-06-07 10:57:57 · 145 阅读 · 0 评论 -
浅谈InoDB中的行级锁
Next-key lock本质上是一个组合锁,它结合了行锁(记录锁)和间隙锁(gap lock)。Next-key lock锁定的是一个前开后闭区间((a, b]),这意味着它锁定从a到b之间的间隙以及b这条记录本身,但不包括a。:这只是一个概念性的表示,为了加强理解方便记,而不是数据库锁的实际实现,因为next-key锁定是由数据库引擎本身管理的行为。Java不能直接控制数据库的锁定机制,而是依赖于数据库引擎的事务和并发控制。发⽣锁冲突的概率是最低的,并发度是最⾼的。每次操作锁住⼀⾏数据。原创 2024-06-06 16:19:57 · 214 阅读 · 0 评论 -
力扣236 二叉树的最近祖先
算法:二叉树的先序遍历,先判断根结点是不是空或者最近祖先,不是则递归遍历左子树,判断左子树是不是空或是最近祖先,再递归判断右子树是不是空或者最近祖先。留个眼,这题做了几次还是忘记,说明理解不深刻。原创 2024-06-05 20:56:08 · 110 阅读 · 0 评论 -
力扣46 全排列 引发对JAVA对象引用的思考
这是因为C++在这种情境下执行的是对象的复制(copy),而不是引用(或指针)的复制。将vv添加到v中时,若是直接添加vv,实际上添加的是vv这个列表的引用,而不是它此刻的内容拷贝。因为在整个 DFS 过程中 vv 不断被修改,所以在 v 中的所有条目最终都会成为同一个列表的引用——而一旦递归完成,这个列表就会是空的。改成v.add(new ArrayList(vv))确保了存储在 v 中的每个排列在被添加到列表时都准确反映了当时的实际状态,而不是最后都指向同一个(最终为空的)列表 vv。原创 2024-06-05 15:28:38 · 410 阅读 · 0 评论 -
登录状态在页面跳转保存的三种方法
工作原理:在服务器验证用户的登录信息后,生成一个含有用户信息的Token(常使用JWT),发送给客户端。工作原理:当用户登录网站后,服务器发送一个或多个 Cookie 到客户端(浏览器),客户端会保存这些 Cookie,并在随后的每个请求中自动将它们发送回服务器,以便服务器识别用户。缺点:安全风险较高,容易受到跨站脚本攻击(XSS)影响,容量限制(每个 Cookie 大小限制在4KB左右),并且每次HTTP请求都会携带Cookie,增加了额外的网络负载。优点:实现简单,使用广泛。原创 2024-06-05 10:00:00 · 203 阅读 · 0 评论 -
面试经典题:创建三个线程,按顺序依次循环打印hello+i
二面被问到的手撕题,自己总计一下。考察的还是比较基础的,但也是对自己知识领悟程度的考察。这里设置为打印10轮。原创 2024-06-04 20:25:42 · 612 阅读 · 1 评论 -
力扣88 合并两个有序数组
这题本身不难,有趣的是第一个数组实际长度是合并后的数组长度,想优化空间复杂度的话需要从后向前比较。有一个较坑的点就是边界一定要注意加上判断,若第一个数组为空就踩坑了!自己没看清题目,以为m是数组总长度,结果是第一个数组的长度。原创 2024-06-04 16:57:53 · 99 阅读 · 0 评论