
面试专题
文章平均质量分 94
面试常见试题分析。
haidi8
这个作者很懒,什么都没留下…
展开
-
一篇读懂设计模式
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多 数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不 断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路, 是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代 码的可重用性、代码的可读性和代码的可靠性提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。客户类和工厂类分开。原创 2023-03-12 11:09:42 · 584 阅读 · 2 评论 -
MySQL调优补充
我们知道,计算机存储数据分为RAM(内存存储)和ROM(磁盘存储),而持久化数据都是存储在ROM上。我们的MySQL是一种存储数据的服务器,针对的就是数据的持久化保存和读取。所以MySQL调优,主要就是优化从ROM上读取数据的速度。因此,MySQL调优主要分为两个部分:硬件调优和SQL调优。针对硬件调优,这部分内容由运维去完成。我们的调优主要针对SQL调优。原创 2023-03-12 10:40:02 · 232 阅读 · 0 评论 -
一篇读懂MySQL调优
计算机的存储空间是一块一块的,通常一块用完了再用另一块,每个存储块是4k一般mysql每次IO是一页,一页是4块16k当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引树中,可以直接使用索引查询而不需要回表。这就是覆盖索引。在索引遍历过程中,对**联合索引**中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。原创 2023-03-12 10:32:08 · 414 阅读 · 0 评论 -
浅谈Springboot框架重要知识点
运行时指定具体的配置文件。原创 2023-02-24 13:39:20 · 376 阅读 · 0 评论 -
浅谈JAVAHashMap 知识点
Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。所有散列函数都有如下一个基本特性**:根据同一散列函数计算出的散列值如果不同,那么输入值肯定也不同。原创 2023-02-24 13:37:12 · 494 阅读 · 0 评论 -
一篇学习JVM
Java安全模型的核心就是Java沙箱(sandbox),沙箱是一个限制程序运行的环境。沙箱机制就是将 Java 代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问,那系统资源包括——CPU、内存、文件系统、网络。不同级别的沙箱对这些资源访问的限制也可以不一样。解释器。原创 2023-02-24 13:37:39 · 384 阅读 · 0 评论 -
浅谈MySQL索引
是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的示意图所示:左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。原创 2023-02-24 13:38:34 · 440 阅读 · 0 评论 -
浅谈Spring循环依赖
想彻底弄清楚spring的循环依赖问题,首先得弄清楚循环依赖是如何发生的spring又是如何检测循环依赖的发生的。其次再探究spring如何解决循环依赖的问题循环依赖就是循环引用,指两个或多个bean互相持有对方,比如说TestA引用TestB、TestB引用TestA,最终形成一个闭环。注意:循环依赖不是指循环调用。循环调用:指方法之间的环调用,循环调用是无解的,除非有终结条件,否则就是死循环,最终会导致内存溢出异常。原创 2023-02-22 22:18:17 · 1121 阅读 · 0 评论 -
浅谈Redisson实现分布式锁的原理
Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,我没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java 提供原生支持。相反,作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。而 Redisson 就是用于在 Java 程序中操作 Redis 的库,它使得我们可以在程序中轻松地使用 Redis。原创 2023-02-22 22:16:37 · 360 阅读 · 0 评论 -
浅谈分布式锁的原理
因为上图中的两个A系统,运行在两个不同的JVM里面,他们加的锁只对属于自己JVM里面的线程有效,对于其他JVM的线程是无效的。通过上面的分析,我们知道了库存超卖场景在分布式部署系统的情况下使用Java原生的锁机制无法保证线程安全,所以我们需要用到分布式锁的方案。假设此时两个用户的请求同时到来,但是落在了不同的机器上,那么这两个请求是可以同时执行了,还是会出现库存超卖的问题。模拟秒杀服务,在其中配置了jedis线程池,在初始化的时候传给分布式锁,供其使用。任何场景下,一旦加锁,效率不可能会高,数据是安全的!原创 2023-02-22 22:15:06 · 500 阅读 · 0 评论 -
浅谈Synchronized的原理
修饰函数我们简称同步函数,线程执行称同步函数前,需要先获取监视器锁,简称锁,获取锁成功才能执行同步函数,同步函数执行完后,线程会释放锁并通知唤醒其他线程获取锁,获取锁失败「则阻塞并等待通知唤醒该线程重新获取锁」,同步函数会以this作为锁,即当前对象,以上面的代码段为例就是。当前线程持有的锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。而这样会出现频繁地对线程运行状态的切换,线程的挂起和唤醒,从而消耗大量的系统资源,导致性能低下。原创 2023-02-22 22:13:44 · 2005 阅读 · 0 评论 -
浅谈ThreadLocal的原理
每个ThreadLocal只能保存一个变量副本,如果想要上线一个线程能够保存多个副本以上,就需要创建多个ThreadLocal。ThreadLocal内部的ThreadLocalMap键为弱引用,会有内存泄漏的风险。适用于无状态,副本变量独立后不影响业务逻辑的高并发场景。如果如果业务逻辑强依赖于副本变量,则不适合用ThreadLocal解决,需要另寻解决方案。原创 2023-02-22 22:12:39 · 435 阅读 · 0 评论 -
浅谈常用的测试框架
这也会大大的增加测试的复杂度,降低程序员的测试积极性。而 Junit 能很好的解决这个问题,简化单元测试,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。思想:就是自己编写一个接口的实现类,然后这个接口的实现类中访问数据库的时候,使用了Map来模拟整个数据的存储、在每一个调用的方法上直接,使用Map来进行操作的这种测试模式 就叫做stub.注意:Junit 测试也是程序员测试,即所谓的白盒测试,它需要程序员知道被测试的代码如何完成功能,以及完成什么样的功能。原创 2023-02-22 22:11:08 · 477 阅读 · 0 评论 -
浅谈常用的日志框架
对于我们日常开发日志是经常使用的,当然以前的我们可能还傻傻的各种System.out.println("重要数据")在控制台输出各种重要数据呢,投入生产的时候再注释掉。JCLSLF4Jlog4jlog4j2logback等等,我们该如何选择呢?原创 2023-02-22 22:08:19 · 953 阅读 · 0 评论 -
浅谈Springboot自动化配置原理
不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。Spring Boot的出现,得益于“习惯优于配置。原创 2023-02-22 22:08:22 · 388 阅读 · 0 评论 -
浅谈CAS原理。
CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。这样说或许有些抽象,我们来看一个例子:1.在内存地址V当中,存储着值为10的变量。2.此时线程1想要把变量的值增加1。对线程1来说,旧的预期值A=10,要修改的新值B=11。原创 2023-02-22 22:05:35 · 253 阅读 · 0 评论 -
浅谈volatile关键字
注意我们的b没有用volatile修饰,我们先启动了线程2的读操作,后启动了线程1的写操作,由于线程1和线程2会保存x和b的副本到自己的工作内存中,线程2执行后,由于他副本b=false,所以会进入到无限循环中,线程1执行后修改的也是自己副本中的b=true,然而线程2无法立即察觉到,所以执行上面代码后,不会打印“执行结束”,因为线程2一直在执行!也就是先执行 flag = true后,另外一个线程马上调用方法2,满足 flag的判断,最终让a + 5,结果为5,这样同样出现了数据不一致的问题。原创 2023-02-22 22:03:29 · 3676 阅读 · 0 评论