- 博客(105)
- 收藏
- 关注
原创 BFF与API Gateway的区别解析
维度BFF核心职责流量管控(认证、路由、限流)业务适配(数据聚合、裁剪)数量通常全局1个按前端类型多个(如Mobile/Web)层级所有请求的第一层位于API Gateway和微服务之间是否改代码配置化(如Nginx/YAML)需要写业务逻辑代码。
2025-03-17 22:23:19
388
原创 Spring Security vs Shiro vs Sa-Token
【代码】Spring Security vs Shiro vs Sa-Token。
2025-03-15 19:05:05
383
原创 HandlerMethodArgumentResolver vs HandlerInterceptor
从请求头中提取 JWT Token,解析为。对象,并作为 Controller 参数。:拦截请求,检查用户是否有权限访问某个接口。
2025-03-11 01:28:39
518
原创 @PostConstruct和InitializingBean的区别
【代码】@PostConstruct和InitializingBean的区别。
2025-03-11 01:19:39
406
原创 Linux日志排查
当Java程序员需要排查线上日志异常时,掌握Linux命令就像医生用听诊器诊断病情一样重要。通过这种生活化的类比和具体案例,即使是Linux新手也能快速理解日志排查的核心思路。关键是多动手实践这些命令组合!搜索"空指针异常",并显示匹配行的前后5行上下文(像用放大镜看异常周围的线索)实时查看日志末尾100行(类似盯着监控屏幕看实时动态)查看Java进程的线程CPU占用(找出消耗资源的线程)统计ERROR出现的总次数(判断问题严重程度)每1秒打印GC情况(观察内存泄漏迹象)
2025-03-07 16:04:07
273
原创 身体不适时保持学习状态的方法
身体状态差时的有效学习时长可能是正常状态的60%,但通过聚焦核心知识点(用80/20法则筛选重点),仍能保持70%以上的知识获取效率。记录每次「低电量模式」的学习数据,逐步建立个人化的疲惫期学习模型。当身体状态不佳、缺乏学习动力时,保持学习状态需要更灵活的策略和对自己身心状态的接纳。记得在状态恢复后,给自己安排一次「补偿性放松」,比如30分钟森林浴或温泉泡脚,让身心形成「努力后必有滋养」的正向循环。
2025-03-07 12:32:53
174
原创 把你知道的jvm都说一下
掌握这些核心要点,既能应对面试,也能在实际开发中快速定位JVM相关问题!建议结合《深入理解Java虚拟机》系统学习。JVM是Java程序的运行引擎,就像汽车的发动机,主要管理内存、执行代码和优化性能。"理解JVM的关键在于掌握内存模型和GC原理。- 栈帧(局部变量表/操作数栈)- 分代设计(新生代/老年代)- 类信息/常量/静态变量。本地方法栈(Native)- 线程执行位置指针。
2025-03-07 11:20:29
907
原创 Spring 循环依赖问题
Spring 的三级缓存像一个“债务协调中介”,通过先写欠条、再逐步兑现的方式,解决了循环依赖的僵局。理解这个机制,面试和实际开发都能游刃有余!的经典场景来类比,结合源码设计原理,帮你彻底理解!Spring 的循环依赖问题可以用。打破僵局,类似“先打欠条后补钱”。
2025-03-06 15:26:16
918
原创 Minor GC vs Major GC vs Full GC
Major GC 只清理老年代,Full GC 清理整个堆+方法区。但有些资料会混用,需结合上下文理解。它只是“建议” JVM 执行,具体由 JVM 决定(可通过。:Major GC 和 Full GC 是同一个概念吗?年轻代(Eden区)空间不足时触发。:如何减少 Full GC 的发生?一定会触发 Full GC 吗?
2025-03-05 16:27:55
1168
原创 jstat vs jmap
jstatjmap定位实时监控工具(仪表盘)内存快照工具(诊断仪)输出动态变化的数据流静态的堆内存快照开销低(基于JMX)高(生成堆转储会暂停应用)场景GC问题初步排查内存泄漏/OOM问题深度分析。
2025-03-05 15:24:27
303
原创 TPS和QPS的区别
客人点餐 → 厨房做菜 → 上菜 → 结账(这是一个完整的"事务")。如果餐厅每秒能处理 10 个这样的完整订单,TPS 就是 10。客人问"有什么推荐菜?" → 服务员回答(这是一个"查询")。如果服务员每秒能回答 50 个问题,QPS 就是 50。
2025-03-05 10:25:05
219
原创 HashMap 与 Hashtable、TreeMap 的区别?
HashMap是没锁的快速抽屉,Hashtable是带锁的老抽屉,TreeMap是自动整理的有序书架。
2025-03-04 14:10:37
852
原创 HashMap 在多线程环境下可能引发哪些问题?如何解决?
问题触发场景解决方案死循环多线程并发扩容(JDK1.7)使用数据丢失多线程同时插入同一位置使用线程安全的容器脏数据读取扩容与读操作并发避免并发读写非线程安全容器关键点:JDK 1.8 的 HashMap 仍非线程安全(尾插法解决死循环,但其他问题仍存在)。永远不要在多线程中直接使用 HashMap,优先选择。
2025-03-04 13:49:42
421
原创 HashMap的table数组何时初始化?默认容量和扩容阈值是多少?
场景初始化时机容量扩容阈值默认构造函数第一次put()16指定容量的构造函数第一次put()最近的 2 的幂容量 × 负载因子容量始终是 2 的幂(优化哈希计算)。扩容是为了减少哈希冲突,保证性能。
2025-03-04 13:43:01
376
原创 为什么HashMap的容量必须是2的幂次
当HashMap扩容时(如从16扩容到32),新的容量仍是2的幂次。理解这一点,就能明白为什么HashMap的设计者坚持容量为2的幂次!如果用户通过构造函数指定了初始容量(如15),HashMap会将其。)中,容量仍为2的幂次,但迭代顺序由链表维护,与哈希计算无关。此方法将任意输入值调整为2的幂次,确保容量始终符合要求。通过一个简单例子和底层原理,直观理解设计背后的逻辑。能均匀覆盖所有索引位置(0到15),且效率极高。若容量为2的幂次(如16),则。如果容量不是2的幂次(如15),在有序的哈希表变体(如。
2025-03-04 13:37:20
314
原创 HashMap知识点总结
HashMap 的底层原理和性能优化是 Java 开发者必须掌握的硬核知识。除传统知识点外,对最新 JDK 特性、高并发场景的深度理解将成为加分项。建议结合源码实践与多线程场景分析,全面提升对该容器的认知层次。其重要性源于其广泛的应用场景、设计原理及对开发者底层理解能力的考察。时初始化,默认容量 16,扩容阈值 12(容量 × 负载因子)。等效取模运算,且扩容时元素仅需分到原位置或原位置+旧容量的位置。默认容量和扩容阈值是多少?: 为什么容量必须是 2 的幂次?: HashMap 的。
2025-03-04 13:34:20
399
原创 模板方法模式
记住这个模式的关键词:流程标准化,步骤个性化,父类掌控大局,子类专注细节。就像麦当劳的操作手册,保证全球口味一致,但允许不同地区调整配料比例。模板方法模式就像炒菜的标准化流程:师傅规定好炒菜的步骤(热油→放主材→放调料→装盘),但允许徒弟根据不同的菜调整放主材和调料的细节。用做菜来理解设计模式之:模板方法模式(附代码示例)三、代码示例(Java版)
2025-03-04 12:51:36
206
原创 为什么Map桶中节点个数超过8才转为红黑树?
这相当于在菜市场中,某个摊位突然排了8个人以上的概率极低(比如突然来了一个旅游团),但为了应对这种极端情况,摊主需要提前准备多层货架。这相当于摊主发现队伍减少到6人时,暂时不拆货架(防止旅游团突然又回来),但降到6人以下时,确认客流稳定减少,才拆掉货架恢复队列。想象一个拥挤的菜市场,摊主(HashMap的桶)如何管理顾客(键值对节点)更高效?计算哈希冲突的概率。
2025-03-03 20:55:44
263
原创 SQL的select语句完整的执行顺序
SQL的SELECT语句的执行顺序可以用"做菜流程"来类比理解。顺序写,但数据库执行顺序完全不同。但因为HAVING COUNT(*)>3和LIMIT 2,最终只显示IT部门(假设IT组实际有超过3人)3. 按类别分组(GROUP BY)→ 4. 检查调料是否达标(HAVING)5. 选择需要的配菜(SELECT)→ 6. 去掉重复的(DISTINCT)1. 准备食材(FROM+JOIN) → 2. 筛选新鲜食材(WHERE)7. 摆盘顺序(ORDER BY)→ 8. 最终装盘量(LIMIT)
2025-03-02 22:42:45
549
原创 缓存一致性之延迟双删
此时有个同学A问阿姨价格 → 阿姨查记录本发现还没更新 → 坚持说15元 → 还把这个错误价格写在小黑板上(脏数据回写缓存)💡 小技巧:面试时可说"虽然这不是银弹,但在资源有限时是性价比很高的过渡方案"
2025-03-02 17:56:53
896
原创 缓存穿透,缓存击穿,缓存雪崩
黑客伪造不存在的账户ID频繁查询:小偷用假身份证到银行金库门口反复试开锁:百万用户同时访问刚过期的爆款商品:劫匪在运钞车到达前瞬间集体冲击金库:双十一零点大量缓存同时失效:全城银行同时断电导致安防系统瘫痪。
2025-03-02 12:50:57
234
原创 Redis为什么这么快
Redis的快源于五大核心设计:性能对比:内存访问速度是SSD的10万倍以上优势:实测数据:单核Redis可处理10万+ QPS示例:4. IO多路侦察兵:智能叫号系统传统阻塞IO:Redis的IO多路复用(epoll/kqueue):代码实现:5. 编码压缩黑科技:食材精加工int编码:直接存储二进制整数embstr编码:短字符串优化存储ziplist:小数据量时压缩存储示例:三、性能数据对比操作Redis耗时MySQL耗时速度倍数单键读取0.
2025-03-02 11:10:02
556
原创 JVM调优
我用「汽车保养+医院体检」的类比帮你轻松掌握JVM调优核心逻辑,看完不仅能应对面试,还能直接解决真实生产问题。。:调优就是改几个参数:通过调整内存模型与GC策略,平衡三者的关系。
2025-02-28 03:25:42
899
原创 Redis除了做缓存还有哪些应用场景
我用「现实场景+代码简例」帮你彻底掌握Redis的18般武艺。。:跳跃列表(SkipList)实现高效范围查询:Set集合(自动去重+交并差运算):GEOHASH编码存储。
2025-02-27 23:39:13
402
原创 Java枚举类
System.out.println("周一综合症");break;System.out.println("快乐星期五");break;//...其他case枚举的有限取值范围让switch代码更安全,避免漏掉分支。
2025-02-27 20:51:28
251
原创 说一下类装载的执行过程?
Bootstrap(加载核心库)→ Extension(扩展库)→ Application(用户类):校验字节码是否符合 JVM 规范(如魔数检查、语法验证),防止篡改的字节码执行。示例:static int age = 18;:为静态变量(static)分配内存并设置初始值(零值):将符号引用(如全限定名)转换为直接引用(内存地址指针)接口初始化不要求父接口全部初始化(用到时才初始化)方法(编译器自动收集静态代码块和静态变量赋值)示例:上一步 age=0,此时执行 age=18。链:验-准-解三步行。
2025-02-26 23:00:16
428
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人