每日一题🚀
聪ζ
练习时长两年半的 Java 开发程序猿
主打项目:微狗实时聊天室、短链狗短链生成、手写轻量级 RPC 框架、万物代码平台
GitHub地址:https://github.com/lhccong
展开
-
每日一题:Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?
简单执行器每次操作都创建新的 Statement;重用执行器缓存并重用 Statement;批量执行器同样重用 Statement 但会在执行多个更新语句时进行批处理。原创 2024-07-19 14:01:06 · 315 阅读 · 0 评论 -
每日一题:ElasticSearch 如何避免脑裂?
1)主节点选举:ES 使用 Zen Discovery 模块进行主节点选举,确保只有一个主节点管理集群元数据。2)仲裁节点数:配置集群的最小主节点数,这个值需要大于总节点数的一半,以确保仲裁节点数达到,避免脑裂。4)网络故障处理:通过配置网络超时和重试机制,减少网络故障带来的影响,防止临时性网络分区导致脑裂。3)集群健康检查:定期进行集群健康检查,如果发现分区,集群会自动尝试恢复并重新连接。原创 2024-07-18 11:12:03 · 214 阅读 · 0 评论 -
面试官问懵我了究竟什么是 SpringCloud?
Spring Cloud 是一系列框架的集合,旨在为分布式系统的开发提供解决方案。它基于 Spring Boot,利用 Spring Boot 的快速开发特性,帮助开发者快速构建分布式微服务架构系统。Spring Cloud 通过集成和封装各种成熟的开源解决方案,提供了配置管理、服务发现、负载均衡、断路器、分布式追踪、消息驱动微服务、网关路由等功能。了解了 SpringCloud 提供了什么能力,现在跟着我来简单了解一下这些能力是干嘛的,别等了!来吧:1)配置管理:集中管理配置,支持动态刷新。原创 2024-05-30 15:37:22 · 725 阅读 · 0 评论 -
instanceof 关键字的作用
其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果 result 都返回 true,否则返回 false。注意:编译器会检查 obj 是否能转换成右边的 class 类型,如果不能转换则直接报错,如果不能 确定类型,则通过编译,具体看运行时定。原创 2024-05-27 16:26:18 · 435 阅读 · 0 评论 -
请介绍类加载过程,什么是双亲委派模型?
📑双亲委派模型(Parent Delegation Model)是Java类加载机制的一种重要实现方式,它基于一个简单的原则:当一个类加载器收到类加载的请求时,它首先不会自己去尝试加载这个类,而是把请求委托给父类加载器去完成。这个过程是递归的,一直向上委托,直至顶层的启动类加载器。只有当父类加载器无法完成加载请求时,子类加载器才会尝试加载。✅双亲委派模型的好处在于它能够保证Java核心库的类不会被自定义的类加载器所替代,从而确保Java核心库的安全性和一致性。原创 2024-05-21 11:28:26 · 316 阅读 · 0 评论 -
为什么不推荐多表Join?
1)⭐多表 Join 操作可能导致性能问题,尤其是在处理大数据量时,Join 操作需要对参与联接的每个表进行扫描、匹配和组合,消耗大量的 CPU 和内存资源,从而导致查询时间变长。2)⭐难以维护,影响代码阅读。2)⚡多表 Join :你需要先在多个目录中分别查找,然后将这些目录信息进行匹配和组合,找到目标书籍。数据库优化器在处理复杂的多表 Join 查询时,可能无法选择最佳的执行计划,导致性能不佳。为了提高多表 Join 查询的性能,需要为每个表创建合适的索引,但这也增加了索引设计和维护的复杂性。原创 2024-05-21 11:26:07 · 653 阅读 · 0 评论 -
最让人易懂的回答:int(11) 这个 11 是什么意思?
表示字段的显示宽度,而不是存储的整数值的长度或大小。整数数据类型的宽度是用于用于显示和填充的,而不是限制存储的范围。这样的设置主要是为了在查询结果中保持一致的显示格式,方便阅读和理解。但请注意,这并不会改变存储的整数值本身。在MySQL数据库中,int(11) 中的。,那么你查询该结果表时则会发现,时,而你输入的整形为。原创 2024-05-17 14:02:01 · 329 阅读 · 0 评论 -
研究了 4.7 个小时终于了解到了索引使用了却没变快的原因
大家好,我是聪,一个乐于分享的小小程序员。前几天我竟然碰见了加了索引,查询效率反而降低了 0.06% ,知道我排查才发现,原来可能是索引没生效,我赶忙来总结一下没生效的原因。原创 2024-05-17 14:00:07 · 818 阅读 · 0 评论 -
Java提供了哪些IO方式❓NIO如何实现多路复用❓
Selector 是一个多路复用器,可以监控多个通道的 I/O 事件(如连接请求、数据到达等)。原创 2024-05-15 09:43:10 · 404 阅读 · 0 评论 -
用好 explain 妈妈再也不用担心我的 SQL 慢了
大家好,我是聪,一个乐于分享的小小程序员。在不久之前我写了一个慢 SQL 分析工具,可以用来分析 Java Mybatis 项目的 SQL 执行情况,其中刚好涉及到了 explain 的使用。感兴趣的可以了解一下。Github 地址⭐:https://github.com/lhccong/sql-slow-mirror原创 2024-05-15 09:38:33 · 970 阅读 · 0 评论 -
Inner Join、Left Join、Right Join 有啥区别?
当两个表的连接字段都存在匹配的行时,这条行才会出现在结果集中。相反,它会返回右表(右边表)的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则会返回 NULL 值。会返回左表(左边表)的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则会返回 NULL 值。时,结果行数的范围表示为:左表行数原创 2024-05-13 09:37:36 · 163 阅读 · 0 评论 -
脏读、不可重复读、幻读分别是什么?
来说说它们之间的区别吧,很多人容易搞混了,脏读是对于读取到了别的事务未提交的数据,幻读是指在事务期间,对于数据总量的突然增加或减少,将别的事物提交的读取到了(针对于数据的数量),不可重复读是指对于同一条数据,在事物执行期间,里面的字段内容发生了变化,读取到了别的事物提交修改的数据。(针对于数据的内容)。举个例子:当事务 A 开始执行,先查询了一条金额为 100 的数据,在这期间,事务 B 将这条数据修改了,金额变成了 80 ,并提交了事务,当事务 A 再次读取时,金额变成了 80,这就是不可重复读。原创 2024-05-13 09:34:54 · 513 阅读 · 0 评论 -
面试官:请介绍类加载过程,什么是双亲委派模型?
🚀类加载过程是指在 Java 程序运行时,将类的字节码文件加载到内存中并转换为 Class 对象的过程。Java 类加载器负责加载类,其主要任务是在运行时查找和装载类文件,以生成对应的 Class 对象。原创 2024-05-11 08:53:44 · 159 阅读 · 0 评论 -
回表的原理竟然这么简单
回表” 是指在使用辅助索引(非聚簇索引)作为条件进行查询时,由于辅助索引中只存储了索引字段的值和对应的主键(聚簇索引)键值,因此需要根据主键(聚簇索引)中的键值去查找实际的数据行,这个过程被称为回表。举个例子:select * from user where age = 20;原创 2024-05-11 08:50:42 · 237 阅读 · 0 评论 -
脏读、不可重复读、幻读分别是什么?
来说说它们之间的区别吧,很多人容易搞混了,脏读是对于读取到了别的事务未提交的数据,幻读是指在事务期间,对于数据总量的突然增加或减少,将别的事物提交的读取到了(针对于数据的数量),不可重复读是指对于同一条数据,在事物执行期间,里面的字段内容发生了变化,读取到了别的事物提交修改的数据。(针对于单条数据的内容)。举个例子:当事务 A 开始执行,先查询了一条金额为 100 的数据,在这期间,事务 B 将这条数据修改了,金额变成了 80 ,并提交了事务,当事务 A 再次读取时,金额变成了 80,这就是不可重复读。原创 2024-05-10 15:55:56 · 290 阅读 · 0 评论 -
synchronized底层如何实现❓什么是锁的升级、降级❓
锁降级是指锁状态从重量级锁转变为轻量级锁或偏向锁的过程。1)轻量级锁🚩:当一个线程进入同步块时,如果目标对象没有被锁定,JVM 会在当前线程的栈帧中创建用于锁记录的空间,尝试使用 CAS 操作将对象头的 Mark Word 更新为指向锁记录的指针。1)锁升级:这个过程就像是门的锁从一个简单的转把锁(偏向锁),到需要钥匙才能打开的锁(轻量级锁),再到需要门卫控制的高级锁系统(重量级锁)。3)从轻量级锁到重量级锁:当轻量级锁的竞争发生时,即 CAS 失败,锁会升级为重量级锁,线程进入阻塞状态,等待锁释放。原创 2024-05-09 14:50:26 · 1280 阅读 · 0 评论 -
来!给我讲讲分库分表!
你好面试官,在我的理解中分库分表分为四个类型,垂直分表、垂直分库、水平分表、水平分库。原创 2024-05-09 14:47:18 · 386 阅读 · 0 评论 -
索引下推原来就这?
通过将部分带有索引的条件交由存储引擎层进行过滤操作,从而减少了 IO(本该由 Server 层做操作,交由 存储引擎层因此叫做 “下推” )。4)如果查询使用了 聚簇索引(主键)查询,索引下推也不会生效,因为其是对于非聚簇索引来进行减少回表次数。3)再通过主键 ID 分别进行回表查询出来得到最终结果[有三个主键 ID 需要回表 3 次]。2)再通过主键 ID 分别进行回表查询出来[有四个主键 ID 需要回表 4 次]。来进行索引过滤,分别找到多条主键 ID 分别是(1、3、6)数据。原创 2024-05-08 14:15:20 · 230 阅读 · 0 评论 -
2024 年你不懂使用了索引反而变慢如何排查你就 OUT 啦
索引失效的场景有很多,也是面试官经常喜欢问的,可以根据具体场景进行排查,具体场景可以分为以下几点原创 2024-05-08 14:13:08 · 1141 阅读 · 0 评论 -
面试官:谈谈你知道的设计模式❓
使用场景🚀:当多个子类有共有的方法,并且逻辑基本相同时,把这些逻辑算法放在单一的模板方法中,子类通过实现抽象方法来提供详细的实现,例如,算法的框架。使用场景🚀:当需要表示对象的部分-整体层次结构,并希望用户忽略组合对象与单个对象的不同,统一地使用组合结构时,例如,图形编辑器中的图形和图形组。使用场景🚀:当作用于某对象结构中的各元素的操作需要改变,而对象结构不变时,例如,在不改变集合元素的类的情况下增加新的操作。使用场景🚀:当有多种算法相似,客户端希望动态地选择使用哪一种算法时,例如,不同类型的排序算法。原创 2024-05-07 09:49:45 · 986 阅读 · 0 评论 -
面试官问:建索引需要注意什么?
6)对经常在 order by、group by、distinct 后面的字段建立索引。2)对于字段的值有大量重复的不要建立索引。比如说:性别字段,在这种重复比例很大的数据行中,建立索引也不能提高检索速度。在 where 关键词后经常查询的字段,建立索引能提高查询的效率。随着数据的增加和修改,索引的性能可能会下降,可以通过重新构建索引或者重新组织索引来提高性能。4)当数据表的修改频率大于查询频率时,应该适当建立索引。因为建立索引会减慢修改的效率,提高查询的效率。1)不能盲目的建立索引。原创 2024-05-07 09:46:33 · 230 阅读 · 0 评论 -
有哪些方法可以在运行时动态生成一个Java类?
这种方法不需要编写实现类的源代码,只需要定义一个实现了 InvocationHandler 接口的类,Java 在运行时会为指定的接口生成实现。虽然反射 API 本身不直接提供生成新类的功能,但可以用于动态调用构造函数、方法和访问字段,这在某些情况下可以作为动态生成类的一部分。2)Javassist:提供了相对更简单的 API 来处理字节码,允许在运行时修改类,不需要对字节码有深入理解。这些库提供了在运行时直接操作或生成 Java 字节码的能力,从而允许创建全新的类或修改现有类的行为。原创 2024-05-06 10:26:09 · 443 阅读 · 3 评论 -
什么叫索引下推?
通过将部分带有索引的条件交由存储引擎层进行过滤操作,从而减少了 IO(本该由 Server 层做操作,交由 存储引擎层因此叫做 “下推” )。4)如果查询使用了 聚簇索引(主键)查询,索引下推也不会生效,因为其是对于非聚簇索引来进行减少回表次数。3)再通过主键 ID 分别进行回表查询出来得到最终结果[有三个主键 ID 需要回表 3 次]。2)再通过主键 ID 分别进行回表查询出来[有四个主键 ID 需要回表 4 次]。来进行索引过滤,分别找到多条主键 ID 分别是(1、3、6)数据。原创 2024-05-06 10:23:28 · 412 阅读 · 0 评论 -
如何保证集合是线程安全的? ConcurrentHashMap 如何?
这样,当多个线程访问不同段的数据时,线程之间就不会发生竞争,从而大大提高了并发访问的效率。在内部进一步优化,使用了一种基于节点的锁定机制,来进一步降低锁的竞争,并提高扩展性。它通过使用一种称为“红黑树”的数据结构来存储高冲突的键,从而在面对高冲突的环境时也能保持良好的性能。类提供了一些静态方法,可以将非线程安全的集合包装成线程安全的集合。这些集合通过内部的锁定机制或者其他并发控制手段来保证多线程访问的安全。这些方法返回的集合通过一个内置的对象锁来同步所有的访问。包提供了一系列的线程安全的集合类,例如。原创 2024-04-30 11:29:18 · 244 阅读 · 2 评论 -
今天来说说一条 SQL 语句的执行过程
在这条查询语句中,大体可以分为两个层面,Server 层和存储引擎层,顾名思义,在 Server 层中涉及到一系列的业务的组件下面会讲述各个组件的功能,而存储引擎层则是负责存储发送过来的数据、提供读写接口等功能(补充:MySQL 的存储引擎是插件式的,一个数据库里面的不同表可以用不同的存储引擎)。,它先会判断你对这个 user 表是否有权限查询,如果没有权限它将会拒绝本次查询,返回错误信息。如果有权限,它将会根据表的存储引擎提供的接口进行数据查询将重复遍历表的行数据,判断 id 字段是否等于 1。原创 2024-04-30 11:20:10 · 366 阅读 · 0 评论 -
每日一题:对比 Java 标准 NIO 类库,你知道 Netty 是如何实现更高性能的吗❓
2)✅零拷贝技术:Netty 在内部实现中采用了零拷贝技术,(斤斤计较)减少了数据在 内存 和 IO 设备之间的复制次数,降低了 内存 和 CPU 的消耗。🌰:使用池化的 Direct Buffer 等技术,在提高 IO 性能的同时,减少了对象的创建和销毁。3)✅优化的线程模型:Netty 采用了多线程模型,通过使用少量的线程处理大量的并发连接,可以更充分地利用多核处理器的性能。同时,Netty 提供了线程池和任务队列等机制,可以灵活地控制线程的数量和任务的调度,提高了系统的吞吐量和响应速度。原创 2024-04-29 09:57:25 · 253 阅读 · 0 评论 -
每日一题:Int 和 Integer 有什么区别❓
选择使用int还是Integer主要取决于使用场景。如果对性能有较高要求且不需要对象的特性,使用int更合适。如果需要使用集合框架或需要空值null表示缺失值,那么使用Integer更加适合。原创 2024-04-25 09:48:46 · 397 阅读 · 1 评论 -
每日一题:动态代理是基于什么原理❓
动态代理是一种在运行时动态生成代理对象,并在代理对象上进行方法调用的编程技术。它主要用于在不修改原有代码基础上,增加或改变某些功能的执行流程。动态代理广泛应用于 AOP(面向切面编程)、RPC(远程过程调用)、事务管理等领域。原创 2024-04-25 09:45:44 · 410 阅读 · 0 评论 -
每日一题:String、StringBuffer、StringBuilder有什么区别❓
使用String时适合字符串不经常变化的场景。StringBuffer适用于需要频繁修改字符串内容的多线程环境,因为它保证了线程安全。StringBuilder是在单线程环境下处理频繁的字符串操作的首选,因为它比StringBuffer提供了更高的性能。原创 2024-04-24 10:08:57 · 182 阅读 · 0 评论 -
每日一题:Spring 框架中都用到了哪些设计模式❓
总之,Spring 框架中充分利用了许多设计模式,提供了良好的扩展性和灵活性,降低了代码的耦合度,提高了代码的可维护性。原创 2024-04-24 10:07:18 · 434 阅读 · 0 评论 -
每日一题:Redis 中的内存淘汰机制、有哪些内存淘汰策略❓
💡 Redis 是一种基于内存的键值数据库,由于内存有限,当 Redis 占用的内存达到上限时,就需要进行内存淘汰,以腾出一些内存空间。3)内存淘汰策略:当 Redis 内存占用达到上限时,会根据内存淘汰策略来选择一些键进行删除,以腾出更多的内存空间。1)定期删除:Redis 可以设置一个定时器,定期扫描键空间中的键,并删除已经过期的键。2)惰性删除:当一个键过期时,Redis 不会立即删除该键,而是等到该键被访问时再删除。4)volatile-lru:从已设置过期时间的键中选择最近最少使用的键进行删除。原创 2024-04-23 11:04:49 · 332 阅读 · 0 评论 -
每日一题:谈谈 final、finally、finalize 有什么不同❓
对于引用类型,这意味着引用本身不可改变,但是如果它指向的是一个对象,那么对象的状态(即内部的值)是可以改变的。无论try块中的代码是否产生异常,或者是否有匹配的catch块捕获了异常,finally块中的代码都会被执行。finally是异常处理结构(try-catch-finally)的一部分,它用于指定一段无论异常是否发 生都要执行的代码。finalize是Object类的一个方法,Java允许子类覆盖这个方法,以实现对象被垃圾回收器回收之前的清理工作。类✨:当final修饰一个类时,这个类不能被继承。原创 2024-04-22 08:31:13 · 317 阅读 · 0 评论 -
每日一题:Spring 的循环依赖怎么解决的,为什么需要加个三级缓存,二级不行么❓
二级缓存只存储了尚未初始化完成的 Bean 实例,而三级缓存存储了 Bean 的工厂对象。这样做的好处是,当发现循环依赖时,可以通过 Bean 的工厂对象来创建 Bean 实例,从而避免了直接从二级缓存中获取可能尚未完成初始化的 Bean 实例而导致的问题。🔍在 Spring 框架中,循环依赖是指两个或多个 Bean 之间相互依赖,形成一个循环引用的情况。这种情况下,Spring IOC 容器在实例化 Bean 时可能会出现问题,因为它无法决定应该首先实例化哪个 Bean。原创 2024-04-19 13:44:16 · 251 阅读 · 0 评论 -
每日一题:简述 TCP 三次握手、四次挥手的流程❓为什么需要三次握手❓为什么需要四次挥手❓
第二次挥手👋:小Y🐑 看到 小鱼🐟 的挥鳍动作,知道 小鱼🐟 想要结束交流,于是 小Y🐑 也向 小鱼🐟 回应了一个摆尾动作,表示“好的,我知道了”,并且停止发送消息,但仍然会接收 小鱼🐟 的消息。第一次握手🤝:小鱼🐟 想要与 小Y🐑 开始交流,于是 小鱼🐟 游到了 小Y🐑 面前,并向 小Y🐑 友好地挥动鱼鳍,表示他想要和 小Y🐑 开始交流,准备好了。第三次挥手👋:过了一会儿,小Y决定也停止发送消息了,于是 小Y🐑 向 小鱼🐟 摆动尾巴,表示他不再发送消息了,但仍然愿意接收 小鱼🐟 的消息。原创 2024-04-19 11:02:29 · 511 阅读 · 1 评论 -
每日一题:线程有哪些状态,等待状态怎么产生,死锁状态的变化过程❓
死锁是指两个或多个线程互相等待对方持有的资源,而导致所有线程都无法继续执行的状态。在多线程编程中,线程可以具有不同的状态。原创 2024-04-18 13:45:56 · 344 阅读 · 1 评论 -
每日一题:Spring MVC 的执行流程是什么❓
1、用户通过浏览器向服务器发送服务请求,请求会被 Spring MVC 的前端控制器 DispatcherServlet 拦截。6、Controller 执行完后会返回一个 ModelAndView 对象,对象包含视图名或包含模型和视图名。3、处理器根据URL找到具体的处理器,生成处理器对象及处理器拦截器,一并返回DispatcherServlet。4、DispatcherServlet 会通过返回的信息选择合适的 HandlerAdapter。9、返回给前端浏览器。原创 2024-04-17 09:25:40 · 428 阅读 · 0 评论 -
每日一题:讲一下 Spring IOC 的实现机制❓
在 Spring 中 BeanFactory 就是 IOC 容器,在 Spring 初始化的时候,创建容器,并将需要创建对象和对象的关系(xml,注解)通过 BeanDefinitionReader 加载到 BeanDefinition 中并保存在BeanDefinitionMap 中,在这个过程中会让 BeanDefinitionProcesser ( Bean的定义信息的后置处理器 ) 进行增强,然后再由 IOC 容器创建 Bean 对象。原创 2024-04-17 09:22:46 · 156 阅读 · 0 评论 -
Java 每日一题:Redis 为什么快❓
并且 Redis 提供了许多不同时间复杂度的数据类型,有 string (字符串)、list (链表)、set (集合) 和 zset (有序集合),不同应用场景,采用合适的数据结构可以降低时间复杂度。2)💡CPU:Redis 对数据的处理还是由 Redis 的主线程来完成,是单线程的。Redis 不采用多线程进行数据的处理,是因为官方说明 Redis 几乎不存在 CPU 的性能瓶颈问题。在 Redis 6.0之后处理网络IO采用了多线程进行处理,但数据的处理还是单线程的。原创 2024-04-16 10:14:14 · 425 阅读 · 1 评论 -
Java 每日一题:Exception 和 Error 有什么区别❓
Java 每日一题,帮助大家更好的痛击面试官🚀原创 2024-04-15 14:58:25 · 312 阅读 · 1 评论