- 博客(27)
- 收藏
- 关注
原创 面试中经典高频算法分享(转自力扣)
1、无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。力扣:力扣解:以这个字符串为例:abcabcbb,当i等于3时,也就是指向了第二个a, 此时我就需要查之前有没有出现过a, 如果出现了是在哪一个位置出现的。然后通过last[index] 查到等于1, 也就是说,如果start 依然等于0的话,那么当前窗口就有两个a了,也就是字符串重复了,所以我们需要移动当前窗口的start指针,移动到什么地方呢?移动到什么地方,窗口内就没有重复元素了呢? 对了,就是a
2022-03-17 21:41:23
947
原创 Spring声明式事务控制
1)事务开始时,通过AOP机制,生成一个代理的connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的容器中。在接下来的整个事务中,客户端与数据库的交互都使用该connection。2)事务结束时,回滚在第一步中得到的代理的connection中的数据库命令,然后关闭该代理connection对象。具体分析:声明式事务很⽅便,尤其纯注解模式,仅仅⼏个注解就能控制事务了?@Enable...
2021-11-30 22:45:13
1246
原创 使用LinkedHashMap实现LRUCache
LRUCache的目的就是当缓存中的数据量达到一定的程度时,添加新的数据会将最近最少被使用的旧数据删除,以保障Cache中的数据都是经常需要的数据,提高命中率。下面是一个基于linkedhashmap的LRUCache的简单实现,关键是重写LinkedHashMap的removeEldestEntry( )方法,在LinkedHashMap中该方法默认返回false(LRUCache本身未考虑线程安全的问题)。public class BasicLRUCache&l...
2021-09-15 10:54:47
415
原创 ClassNotFoundException和NoClassDefFoundError的区别
在java开发中经常遇到的两个异常, ClassNotFoundException 和NoClassDefFoundError。 表面看起来都是类找不到的异常,但是具体又有什么区别呢?如它们的名字所说明的:NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常。 在Java中错误和异常是有区别的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序,也就是说Exception我们可以用try …catch…等手段让程序继续...
2021-02-25 14:47:23
180
2
原创 ConcurrentHashMap的介绍以及1.7和1.8版本的区别
相信大多数的同学在面试的过程中ConcurrentHashMap是一个绕不开的话题,那么ConcurrentHashMap的一些重要方法如put()、get()、size()等方法的实现过程是怎么样的?以及JDK1.7和1.8又有什么样的区别?我们先来介绍1.7版本的ConcurrentHashMap: 在初始化ConcurrentHashMap的时候,会初始化一个Segment数组,容量为16,而每个Segment都继承了ReentrantLock类,也就是说每个Segment类本身就是一...
2021-01-09 19:36:09
2757
原创 TestNG测试框架与surefire插件
1、testng1.1 testng的介绍TestNG是Java中的一个测试框架,类似于JUnit功能都差不多,只是功能更加强大,使用也更方。用XML文件运行套件测试,TestNG不仅可以做捆绑类测试,也可以捆绑方法进行测试。TestNG的运行方式更加灵活,注释更加丰富。对于大型测试套件,我们不希望在某一项测试失败时就得重新运行数千项测试,TestNG 的灵活性在这里尤为有用。1.2 testng的常用注解@Test --TestNG 的测试类是普通的老式 Java 对象;不需要扩.
2020-09-21 10:46:03
1053
原创 多线程的等待超时机制--wait(remain)
开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之,超时返回默认结果。等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤,而这种范式无法做到超时等待。而超时等待的加入,只需要对经典范式做出非常小的改动,改动内容如下所示。假设超时时间段是mills,那么可以推断出在当前时间System.currentTimeMillis()+mills之后就会超时。long over...
2020-07-19 12:07:06
2587
转载 RocketMQ 怎么保证的消息不丢失
一、消息发送过程我们将消息流程分为如下三大部分,每一部分都有可能会丢失数据。 生产阶段:Producer通过网络将消息发送给Broker,这个发送可能会发生丢失,比如网络延迟不可达等。 存储阶段:Broker肯定是先把消息放到内存的,然后根据刷盘策略持久化到硬盘中,刚收到Producer的消息,再内存中了,但是异常宕机了,导致消息丢失。 消费阶段:消费失败了其实也是消息丢失的一种变体吧。 二、Producer生产阶段Producer通过网络将消息发送给Broker,
2020-07-03 11:54:27
1753
原创 SpringBoot的启动过程 --banner.txt实现打印炫酷控制台图案
SpringBoot的启动过程:我们知道 Spring Boot 程序的入口是 SpringApplication.run(Application.class, args) 方法,那么就从 run() 方法开始分析吧,它的源码如下:public ConfigurableApplicationContext run(String... args) { // 1.创建并启动计时监控类 StopWatch stopWatch = new StopWatch(); stopWatc
2020-06-03 11:38:35
2221
原创 java采用CountDownLatch +“多线程”----实现多个线程分别处理不同任务
最近在工作时,有一位同事遇到了一个查询优化的问题,过来向我请教。 问题大致是这样的:要给前端提供一个查询的接口,而在此接口中要去调用远端的10几个ESB接口,由于要调用的远端ESB接口数量过多导致此接口响应异常缓慢,甚至于达到了十几秒钟。现在要想办法去优化这个接口。这十几个远端的ESB接口不用关心调用顺序,不需要互相依赖。 针对于这个问题,我其实第一反应想到的是采用...
2020-05-07 19:37:40
1243
原创 ApplicationContext?SpringBoot中静态方法如何引用非静态对象?
最近在项目开发中遇到了一个问题:在SpringBoot项目中静态方法的上下文如何引用非静态的对象?先来说项目中的需求:项目中要开发一个工具类用于调用远端网关的Http接口,在调用网关接口之前需要先获取一个Token令牌(我们项目中获取Token令牌的方式是由进程去请求、检查、更新令牌,然后将有效的令牌存在Redis缓存中)。成功的获取到Token之后再拿着有效的Token去请求远端的网关H...
2020-04-13 15:42:47
2102
原创 Java标识接口Serializable
对于Java序列化的认知,我一直停留在最浅显的认知上(把那个要序列化的类实现 Serializbale接口就可以了)。但是我工作也将近有两年了,见到Serializbale 的次数越来越多,我便对它产生了浓厚的兴趣。最近也是因为疫情的原因,刚刚复工没多久,工作不饱和,有点时间研究研究了。关于Java序列化:Java 序列化是早在JDK 1.1 时就已经引入的一组开创性的特性,用于将...
2020-03-10 12:01:32
272
转载 面试中被问到HashMap的结构,1.7和1.8有哪些区别?这篇做深入分析!
一、真实面试题之:Hashmap的结构,1.7和1.8有哪些区别不同点:(1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。(2)扩容后数据存储位置的计算方式也不一...
2020-02-25 17:04:41
1754
1
原创 Java异常try...catch...finally与IllegalMonitorStateException异常原因
1、异常分类 JDK中定义了一套完整的异常机制,所有异常都是Throwable的子类,分为Erro和Exception。Error是一 种非常特殊的异常类型,它的出现标识着系统发生了不可控的错误,例如StackOverflowError、OutOfMemoryError。针对此类错误,程序无法处理,只能人工介入。Exception 又分为checked异常( 编译时异常)和unchec...
2019-12-13 18:20:23
461
转载 Redis的这八个问题,验证你是否精通!
1、为什么使用Redis分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。回答:如下所示,分为两点(一)性能如下图所示,我们在碰到需要执行耗时特别久,且结果...
2019-10-18 11:00:06
233
转载 SQL 性能优化梳理
1 基本概念简述1.1 逻辑架构 第一层:客户端通过连接服务,将要执行的sql指令传输过来 第二层:服务器解析并优化sql,生成最终的执行计划并执行 第三层:存储引擎,负责数据的储存和提取 1.2 锁数据库通过锁机制来解决并发场景-共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资源。写锁是排他的,并且会阻塞其他的读锁和写...
2019-10-10 09:38:57
156
原创 RESTful规范 GET请求、POST请求、PUT请求、DELETE请求?
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。RESTFul规范:一.http动词:GET(SELECT):从服务器取出资源(一项或多项)POST(CREATE):在服...
2019-09-19 11:24:59
10770
原创 利用Navicat导入Excel数据到数据库
一、工具准备Navicat数据库管理工具。 execl表格和数据,execl表格中的数据格式为:第一行表头为数据库字段,其余为数据 二、数据导入 1、打开Navicat工具,并找到要导入的目标数据库,右键鼠标选择“导入向导” 2、在弹出页面中选择导入文件格式为Execl文件,然后点击“下一步” 3、在弹...
2019-08-30 10:11:55
6520
4
原创 MySQL索引的介绍、建立、使用
什么是索引索引(在MySQL中也叫做“键(key)") 是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降。索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有...
2019-08-14 18:51:28
138
原创 优化Java锁性能的方法有哪些?
锁是最常见的同步方法之一。在高并发环境中,激烈的锁争用会导致程序性能下降,因此有与锁相关的一些性能问题,以及避免死锁、降低锁粒度和锁分离等一些注意事项都是有必要讨论和研究清楚的。在单核CPU上使用并行算法的效率通常低于原来的串行算法。而并行计算之所以能够提高系统的性能,并不是因为它“工作量小”,而是因为它能够更合理地调度任务,充分利用各个CPU资源。因此,合理的组合可以最大限度地提高...
2019-07-30 15:26:14
536
1
原创 正确认识MVC和三层架构之间的区别和联系
这里首先要明确的一点是:MVC不等于三层架构,我从学习到工作中很多人经常都会说的一句话就是MVC三层架构,这其实是一种错误的说法,正确的说法应该是MVC和三层架构。看MVC解释: M是指mode(模型)也就是每天都在操作使用的JavaBean; V是指view(视图),如使用的前端表现页面JSP 等; C是指Control...
2019-07-10 11:38:50
371
原创 线程池中如何寻找堆栈?如何打印出堆栈的异常信息?
先由一个案例引入,来解释为什么要寻找线程池中的堆栈。请看下面的一个简单案例,有一个Runable接口,用它来计算两个数的商。public class DivTask implements Runnable { int a,b; public DivTask(int a, int b) { this.a = a; this.b = b;...
2019-06-27 17:07:07
1327
原创 Java线程池的实现
首先,对于什么是线程池?使用线程池的好处是什么?都没有必要做过多的解释。一、线程池执行流程直接来看线程池的执行流程原理:二、JDK对线程池的支持 为了能够更好的控制多线程,JDK提供了一套Executor框架,帮助开发人员有效的进行线程控制,其本质就是一个线程池,核心成员如下,他们都在java.util.concurrent包下,也是jdk并发包的核心类。图...
2019-06-11 16:25:12
184
原创 Java并发包的简单介绍
同步容器类1、VectorVactor和ArrayList相同的是也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。从底层源码中可以看出,Vector的add、remove等方法都加了关键字synchronized,因此它是线程安...
2019-06-06 13:03:36
206
原创 Spring Data JPA的自动更新,为什么会自动更新?如何避免自动更新?
公司的项目后台架构是SpringBoot + Spring Date JPA,采用MySQL数据库。在工作刚开始时就遇到了一个奇怪的现象。在采用Date JPA查询完数据库之后,若改变了查询出的对象属性,那么数据库就会自动更新。比如查询出一个studentPO的name为“小明”,然后进行了一步studentPO.setName("小红")操作,再返回给前台,此时的数据库中的这个studentPO...
2019-06-01 16:05:04
12339
11
原创 IntelliJ IDEA 的常用设置和快捷键操作--享受高效开发
大学阶段使用的是eclipse,工作后开始接触idea,在使用了一段idea之后,完全被它的强大之处深深吸引,尤其是它的代码智能提示补全。此外它的debug模式和插件安装上用起来也是非常的方便。总之idea的合理使用将会大大的提高程序员的开发效率。最近有空,就把idea的常规操作设置总结了一下。一.IntelliJ IDEA介绍与常规设置IDEA 全称 IntelliJ I...
2019-05-29 21:25:45
2236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人