- 博客(64)
- 收藏
- 关注
原创 Java BitSet 实战:512MB 内存去重 40 亿整数的秘密武器
本文介绍了如何利用Java标准库中的BitSet类,在仅512MB内存限制下高效完成40亿条QQ号去重任务。传统方案如HashSet或数组排序因内存不足而失败,而BitSet通过位图标记存在性,将每个整数映射为1bit,大幅降低内存消耗。针对32位无符号整数范围超出BitSet索引限制的问题,采用双BitSet分段策略解决。实测显示该方法在40GB数据量下仅需45分钟完成去重,且结果天然有序。相比其他方案,BitSet是稠密整数去重的理论最优解,同时适用于用户标签系统、布隆过滤器等场景。文章强调工程师应善用
2025-12-02 11:45:56
698
原创 20亿手机号存储:选 INT 还是 STRING?VARCHAR 还是 CHAR?深度解析
摘要: 手机号存储应使用字符串类型(CHAR(11)或VARCHAR(15)),而非整数类型。INT存储会丢失前导零、无法支持国际号码(如+86前缀),且存在溢出风险。字符串存储更符合手机号作为"标识符"而非"数值"的本质。国内统一11位号码推荐CHAR(11),国际场景使用VARCHAR(16)存储E.164格式。在20亿条数据规模下,字符串方案虽多占4-9GB存储,但能确保数据安全性和扩展性,性能差距可忽略。最佳实践包括输入标准化、加唯一索引和避免明文存储。(14
2025-12-02 09:48:28
703
原创 Java 工程师的高效开发利器:20+ 款必备效率工具清单
本文系统梳理了Java开发全链路中常用的20+款高效工具,涵盖IDE、版本控制、调试诊断、构建部署等多个维度。重点推荐IntelliJ IDEA、Git、Arthas、Gradle等核心工具,并介绍AI编程助手等新兴趋势。文章强调工具不在于多而在于精,建议开发者根据需求选择适合自己的工具链,将其深度融入工作流程以提升效率。最后提供了从开发到协作的完整工具组合建议,帮助Java工程师打造高效开发环境。
2025-11-26 16:41:10
1052
原创 Spring Boot 发送邮件完整教程:从配置到实战
本文介绍了在Spring Boot项目中实现邮件发送功能的完整步骤。首先通过添加spring-boot-starter-mail依赖引入邮件功能,然后配置SMTP服务器信息(以QQ邮箱为例说明获取授权码的方法)。接着创建MailService类实现简单文本邮件和HTML邮件的发送功能,并编写测试接口进行验证。文章还扩展了发送附件邮件的方法,并给出了异常处理、异步发送等最佳实践建议。该实现可满足用户注册验证、订单通知等常见邮件发送需求,提供了从基础到进阶的完整邮件功能开发指南。
2025-11-26 16:22:10
516
原创 【深度对比】Apache HttpClient vs OkHttp:2025年Java开发者如何选择HTTP客户端?
【摘要】 本文深度对比Java生态两大HTTP客户端库:Apache HttpClient与OkHttp。Apache HttpClient以企业级扩展性著称,适合需要精细控制HTTP协议的企业应用;OkHttp凭借简洁API和高性能,成为移动开发首选(98% Android应用采用)。基准测试显示,OkHttp在吞吐量(+41%)和延迟(-28%)方面优势明显。两者在API设计上差异显著:Apache HttpClient配置复杂但功能全面,OkHttp通过拦截器链提供更灵活扩展。关键区别在于现代协议支持
2025-11-08 14:40:40
1093
原创 别再用 java.util.Date 了!现代 Java 时间处理的正确姿势
Java 8引入的java.time包取代了存在诸多缺陷的java.util.Date。Date存在五大问题:可变性导致线程不安全、命名误导(实际是时间戳)、时区处理混乱、格式化API设计糟糕(SimpleDateFormat非线程安全)、反人类的0起始月份计数。相比之下,java.time提供了清晰的类型(如LocalDate、ZonedDateTime),具有不可变性、线程安全、显式时区支持等优势。迁移时可通过Instant桥接新旧API。结论:新项目应完全采用java.time,旧系统逐步迁移。
2025-11-07 15:45:39
1090
原创 Redis + Caffeine 两级缓存架构:高性能系统的必备组合
本文探讨如何构建高性能的两级缓存架构,结合本地缓存(Caffeine)与远程缓存(Redis),以应对百万级QPS场景。分析了单一缓存的局限性:Redis存在网络延迟,本地缓存难以保证一致性。提出两级缓存方案,通过Caffeine拦截90%+热点请求(纳秒级延迟),Redis作为共享层确保数据一致性(毫秒级延迟)。详细设计了读写流程:读操作优先查询本地缓存,未命中时穿透至Redis和数据库;写操作先更新DB再删缓存,并通过Redis Pub/Sub广播实现多节点本地缓存同步。提供了Spring Boot集成
2025-11-07 15:05:14
976
原创 Spring Boot 动态多数据源实战:读写分离、多租户一键切换
Spring Boot动态多数据源实现方案 本文介绍了一个基于Spring Boot 3.x+JDK17+的动态多数据源解决方案,主要支持读写分离和多租户场景。核心采用"注解+AOP+ThreadLocal+AbstractRoutingDataSource"技术组合: 通过@DS注解声明数据源 使用AOP切面解析注解并设置线程局部变量 基于ThreadLocal实现线程隔离 继承AbstractRoutingDataSource实现动态路由 方案特点: 支持方法/类级别灵活切换 自动清
2025-11-06 15:12:40
1351
原创 Spring Boot 集成 Elasticsearch 的完整指南(2025 年最新版)
本文介绍了2025年推荐的Spring Boot与Elasticsearch集成技术栈。主要内容包括: 技术栈选择:推荐Spring Boot 3.2+、Elasticsearch 8.10+及Spring Data Elasticsearch 5.2+组合,使用新的Elasticsearch Java API Client替代旧版REST Client。 开发配置: 提供Maven依赖配置示例 Elasticsearch连接参数设置方法 实体类映射注解使用说明 核心功能实现: 通过继承Elasticsea
2025-11-06 15:05:18
1273
原创 慎用 @Transactional:Spring 声明式事务的陷阱与最佳实践
Spring 中的 @Transactional 注解虽然方便,但滥用会导致事务失效、性能下降等问题。本文深入分析了其底层代理机制和典型陷阱:同类内部调用失效、非 public 方法无效、异常捕获不回滚、传播行为配置错误等。同时指出事务会带来连接池压力、锁竞争等性能开销。 作者建议:保持事务方法短小精悍、明确指定回滚规则、合理设置超时、只读操作显式声明、避免在高层使用事务。对于复杂场景,可考虑编程式事务。强调事务不是装饰品,而是数据一致性的承诺,应在理解其机制的基础上谨慎使用。
2025-11-06 14:13:01
892
原创 Spring Boot 集成 Redis 教程(含缓存注解、JSON 序列化、分布式锁)
本文介绍了如何在Spring Boot项目中集成Redis,实现高性能缓存、分布式会话共享和分布式锁等功能。主要内容包括:通过Docker快速部署Redis,添加Maven依赖,配置RedisTemplate进行基础操作,使用JSON序列化优化可视化调试,以及通过Spring Cache注解实现声明式缓存。最后提供了基于SETNX的分布式锁实现方案。适用于Java后端开发者快速掌握Spring Boot与Redis的集成开发。
2025-11-05 16:54:27
1454
原创 Spring Boot 集成 RabbitMQ 详细教程:从入门到生产实践
本文介绍了Spring Boot整合RabbitMQ的实现方案,重点讲解了生产级配置要点。通过Docker快速搭建RabbitMQ环境,使用Spring Boot的AMQP Starter简化接入。文章涵盖了核心概念回顾、基础配置、消息发送与接收实践,特别强调了消息可靠性保障机制,包括手动ACK确认、死信队列处理异常消息等关键配置。通过订单处理示例,展示了从消息发送、路由到消费的完整流程,帮助开发者构建可靠的异步消息系统。
2025-11-05 09:37:07
1325
原创 手把手教你用 Spring Boot 搭建一个 MCP Server
是由 Anthropic 提出的一种标准化协议,用于让语言模型(LLM)以结构化方式访问外部工具和数据源。Tool.java// 返回 JSON Schema✅ 定义工具接口Tool✅ 实现具体业务逻辑(如时间、天气、订单查询)✅ 使用自动注册✅ 提供/mcp/tools和两个标准接口✅ 安全加固 + 监控日志✅ 部署上线并接入 AI Agent🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
2025-11-04 15:41:32
1845
原创 Spring Boot 启动优化:从 10 秒到 2 秒的实战指南
摘要:本文针对Spring Boot应用启动时间过长的问题,提出六大优化策略。首先分析了自动配置、类扫描、Bean初始化等导致启动慢的根源,然后给出具体解决方案:1)精简自动配置;2)启用懒加载;3)使用CGLIB代理;4)优化JVM参数;5)采用Spring Boot 3+GraalVM原生镜像;6)其他技巧如禁用banner、异步初始化等。文章还介绍了启动监控工具,帮助开发者将启动时间缩短50%-80%,满足开发热启动<3秒、生产冷启动<5秒的优化目标。
2025-11-04 11:08:44
1378
原创 Java 设计模式详解:从入门到实践
设计模式是面向对象开发中解决常见问题的经典方案,分为创建型、结构型和行为型三大类。创建型模式(如单例、工厂方法、建造者)控制对象创建;结构型模式(如适配器、装饰器)处理类和对象组合;行为型模式管理对象间通信。这些模式提升代码复用性、可维护性和扩展性,降低模块耦合度。Java示例展示了单例的双重检查锁定、工厂方法的灵活创建等实现方式,帮助开发者应用这些经过验证的设计模板。
2025-11-04 10:27:42
802
原创 Java 金额计算避坑指南:别再用 double 了!
Java金额计算避坑指南 在Java开发中,处理金额时应避免使用float/double类型,因其二进制浮点特性会导致精度误差。正确的做法是: 使用BigDecimal:通过字符串或valueOf()方法构造,避免直接使用浮点数 设置舍入模式:除法/乘法操作必须指定精度和舍入策略(如HALF_UP) 正确比较金额:使用compareTo()而非equals() 最佳实践:封装Money值对象,数据库使用DECIMAL类型 核心原则:金融计算必须精确到分,任何微小误差都不可接受 遵循这些规范可避免资金损失、对
2025-11-03 14:45:27
746
原创 基于 Spring Boot 的大模型集成入门:Spring AI 实践
本文介绍了如何使用Spring AI快速集成大语言模型服务。主要内容包括:创建Spring Boot项目、添加Spring AI依赖、配置API密钥(以OpenAI为例)、编写简单的AI接口控制器。文章还提供了进阶技巧(系统指令、流式响应)和学习资源。通过5个步骤即可完成从项目搭建到AI调用的完整流程,适合Java/Spring开发者快速上手AI集成开发。
2025-11-03 09:29:14
1579
原创 SpringBoot 内置的 20 个高效工具类,助你开发效率翻倍!
本文介绍了SpringBoot内置的20个高效工具类,涵盖字符串、集合、文件、日期等常见开发需求。这些工具类来自spring-core、spring-web等模块,无需额外依赖即可使用,包括: StringUtils提供字符串判空、分割等功能 CollectionUtils处理集合操作 Assert简化参数校验 FileCopyUtils实现文件流拷贝 BeanUtils快速复制对象属性 StopWatch监控代码性能 WebUtils获取Web请求参数 HtmlUtils防止XSS攻击等。通过实用代码示例
2025-11-02 15:47:29
864
原创 MyBatis-Plus 全方位深度指南:从入门到精通
MyBatis-Plus是一款MyBatis增强工具,通过无侵入方式提供强大功能,显著提升开发效率。本文系统介绍其核心优势(通用CRUD、条件构造器、自动分页等)、Spring Boot快速集成方案(依赖配置、实体映射、Mapper接口使用)以及条件构造器(QueryWrapper/LambdaQueryWrapper)的详细用法。文章还涵盖自动分页、乐观锁等高级特性配置,并通过实例代码演示基础CRUD操作,帮助开发者从入门到精通掌握MyBatis-Plus的核心功能与应用场景。
2025-11-01 14:40:48
1189
原创 JAR 命令实用教程与常见问题
本文详细介绍了Java归档工具JAR文件的基础知识和常用操作。主要内容包括:JAR命令的基本语法和常用选项说明;创建普通JAR文件、可执行JAR(带主类)以及包含目录结构JAR的具体方法;如何查看和解压JAR内容;MANIFEST.MF元数据文件的关键字段和编写规范。文章还针对"no main manifest attribute"等常见问题提供了解决方案,并给出了使用构建工具管理JAR、避免绝对路径等最佳实践建议。最后附上常用命令速查表,帮助开发者快速掌握JAR文件的操作技巧。
2025-11-01 14:29:00
1120
原创 项目里竟有3个StringUtils?我该用哪个?
本文对比了Apache Commons Lang、Spring和Hutool三大框架中的字符串工具类(StringUtils)。从功能覆盖来看,Apache功能最全,Spring较基础,Hutool最全面且API更现代;性能上三者差异不大;依赖方面,Apache可单独引入,Spring需整体引入,Hutool需全库引入。建议:传统项目选Apache,Spring生态项目用Spring自带工具,新项目推荐Hutool。开发者应根据项目需求选择适合的工具类,避免混用,以提升代码质量和开发效率。
2025-10-31 15:47:40
881
原创 一个ThreadLocal,竟让线上服务内存爆了?
摘要: ThreadLocal使用不当容易引发内存泄漏和OOM问题,尤其在线程池+ThreadLocal场景下。核心原因是ThreadLocalMap的key为弱引用会被回收,但value仍保持强引用,导致无效Entry堆积。典型风险场景包括:未调用remove()、存储大对象、非static声明等。解决方案包括:务必调用remove()、声明为static final、避免存放大对象、使用try-finally确保清理。合理使用ThreadLocal需遵循"set后必remove"原则
2025-10-31 15:34:35
1236
原创 服务突然崩了?99%的Java程序员都踩过的OOM坑!
文章摘要:本文系统剖析了Java开发中常见的OOM(内存溢出)问题,详细讲解5种典型OOM类型(堆内存、GC超限、元空间、线程创建、直接内存)的产生场景与解决方案。提出JVM调优"五步法":明确应用类型、合理参数设置、监控工具使用、堆dump分析和持续验证优化,并推荐ZGC等现代技术。强调调优需结合代码优化与系统监控,帮助开发者从功能实现进阶为系统守护者。文末提供调优检查清单和延伸学习资料。
2025-10-31 09:40:31
746
原创 深入理解 Java 中的 VO、BO、PO、DTO、DO:领域分层设计的核心概念
在Java企业级开发中,分层架构设计常涉及VO(视图对象)、DTO(数据传输对象)、BO(业务对象)、PO(持久化对象)和DO(领域对象)五种核心对象。这些对象各司其职,VO负责前端展示、DTO用于接口传输、BO封装业务逻辑、DO承载领域模型、PO映射数据库。它们的合理使用能实现高内聚、低耦合的设计目标,避免数据污染和逻辑混乱。最佳实践包括分层对象流转、统一命名规范、使用转换工具等,从而提升代码可维护性和系统扩展性。
2025-10-30 16:16:23
1452
原创 Java 8到Java 25的技术演进,你知多少?
Java 8到Java 25的技术演进 从2014年到2025年,Java实现了从保守型企业级语言向现代化、高效、开发者友好平台的转型。核心演进包括: 函数式编程(Java 8):引入Lambda、Stream API和Optional,简化集合操作与空值处理。 语法现代化: 文本块(Java 15)优化多行字符串 Records(Java 16)简化数据类 模式匹配(Java 21)增强类型检查 String Templates(Java 25)支持字符串插值 并发革命: 虚拟线程(Java 21正式)实
2025-10-30 09:53:43
1343
原创 Linux 服务器崩溃了怎么办?
Linux服务器崩溃急救指南:5种崩溃类型诊断与标准化恢复流程,包括通过控制台访问、资源检查(CPU/内存/磁盘)、日志分析和针对性恢复措施。提供10分钟快速定位方法、重启后日志备份分析建议,以及预防措施如logrotate配置、systemd内存限制等。附常用命令速查表,强调远程控制台和基础监控的重要性。遵循"先诊断后动手"原则,避免盲目操作导致业务损失扩大。
2025-10-29 09:38:46
1130
2
原创 Java基础:HttpURLConnection
HttpURLConnection 是 Java 内置的 HTTP 客户端类,适合轻量级请求场景。文章详细介绍了其基本流程,包括创建连接、设置请求方法/头、写入请求体(POST 必需setDoOutput(true))及读取响应。提供了 GET 和 POST 请求的完整代码示例,并解释了关键配置项(如超时设置、请求头处理)。同时涵盖了表单提交、Cookie 管理、重定向控制等常见场景,最后对比了其优缺点:虽然无需依赖但 API 较为繁琐,推荐复杂场景使用第三方库(如 HttpClient/OkHttp)。
2025-10-29 09:27:58
461
原创 Java基础:Socket 编程
Socket 编程是 Java 实现 TCP 网络通信的核心技术,通过 ServerSocket 和 Socket 类可实现客户端-服务器模型。ServerSocket 用于监听端口并接受连接,Socket 则代表通信端点,通过输入/输出流实现双向数据传输。文中提供了完整的 Echo 服务器示例,服务端采用多线程处理并发连接,客户端通过标准输入与服务器交互。关键点包括阻塞式 I/O、多线程处理、资源管理(try-with-resources)和消息协议设计(以换行符为消息边界)。注意处理网络异常和正确关闭资
2025-10-29 09:01:40
667
原创 Java基础:网络基础概念
Java网络编程的基础是理解IP地址和端口(用于定位设备和服务),以及TCP与UDP两种传输协议。IP地址分为IPv4/IPv6,端口范围0-65535用于区分应用;TCP协议可靠但效率较低,适合重要数据传输;UDP协议高效快速但不可靠,适用于实时通讯。在Java中,TCP通过Socket/ServerSocket实现,UDP则使用DatagramSocket/DatagramPacket。应用场景上,HTTP服务通常基于TCP,而音视频传输等实时应用更适合UDP。掌握这些核心概念是进行网络开发的前提。
2025-10-29 08:44:22
936
原创 Windows 11 C盘清理
Windows 11 C盘清理指南(安全高效) 本文提供系统盘清理方案,帮助释放10-50GB空间。首先推荐使用系统自带工具:1)磁盘清理(删除更新/临时文件);2)开启存储感知自动维护。其次可手动清理:更新缓存、休眠文件(非休眠用户)、用户临时目录。高级操作包括迁移虚拟内存、使用WinDirStat定位大文件、转移个人文件夹。关键注意事项:勿删除系统核心目录(Windows/Program Files),WinSxS文件夹需用DISM命令清理。建议按安全顺序操作,不确定文件勿删。通过系统工具+手动优化组合
2025-10-28 15:33:37
4903
原创 Java基础:多线程基础之【线程同步】
本文系统讲解了Java多线程编程中的线程同步机制。首先通过计数器案例展示了多线程竞争共享资源导致的数据不一致问题,然后详细介绍了三种核心同步机制:synchronized关键字(同步方法/代码块)、volatile变量和ReentrantLock显式锁,对比了它们的特性和适用场景。文章还介绍了java.util.concurrent包中的高级同步工具如原子类、CountDownLatch等,并给出了线程同步的最佳实践建议,包括缩小锁范围、避免死锁等。最后总结了不同同步机制在原子性和可见性方面的差异,帮助开发
2025-10-28 10:36:58
899
原创 Java基础:多线程基础之【线程创建与使用】
Java多线程编程提供了多种实现方式,主要包括继承Thread类、实现Runnable接口(推荐)、Callable+FutureTask以及线程池技术。继承Thread类简单直接但耦合度高,实现Runnable接口更符合设计原则且支持线程复用。线程启动必须调用start()而非run()方法,否则无法实现并发。Java 8引入的CompletableFuture提供了更强大的异步编程能力,支持链式调用、任务组合和异常处理,适合复杂异步场景。开发中应根据需求选择合适方式,简单任务用Runnable+Thre
2025-10-28 09:25:29
580
原创 Java基础:多线程基础之【线程概念】
概念说明进程(Process)一个正在运行的Java程序实例(如java MyApp启动的JVM),拥有独立的内存空间(堆、方法区、栈等),是操作系统资源分配的基本单位。线程(Thread)进程内的一个执行流,是CPU调度的基本单位。一个JVM进程可包含多个线程,它们共享堆和方法区,但各自拥有独立的虚拟机栈和程序计数器。进程是“程序的运行实例”,线程是“进程内的执行单元”;Java中多线程共享堆内存,但栈私有。Java线程有6种状态,理解状态转换是排查死锁、活锁、性能瓶颈的基础。
2025-10-28 08:58:38
946
原创 Java 基础:IO 流之【字符流】
永远不要直接使用FileReaderFileWriter→ 改用并指定编码(如UTF-8文本处理务必使用缓冲流→readLine())和newLine()使用 try-with-resources 自动关闭流→ 避免资源泄漏明确区分文本与二进制数据→ 文本用字符流,其他用字节流优先考虑 NIO.2 的Files工具类→ 对于简单文件操作,代码更简洁安全字符流是 Java 处理文本数据的“桥梁”,它屏蔽了底层字节与字符编码的复杂性,让我们能以“人类可读”的方式操作文件。
2025-10-27 10:51:59
1106
原创 Java基础:IO流之【字节流】
Java字节流是处理二进制数据的基础I/O机制,通过InputStream和OutputStream抽象类及其子类(如FileInputStream/FileOutputStream)实现文件读写。字节流以8位字节为单位,适合处理任意类型文件(文本、图片、音频等),通过缓冲流(BufferedInputStream/BufferedOutputStream)可提升性能。使用时需注意及时关闭流(推荐try-with-resources)、异常处理和平台路径兼容性。相比字符流,字节流不处理编码,但通用性更强。
2025-10-27 10:23:44
665
原创 Java基础:IO流之【文件操作】
摘要: Java基础I/O流是文件操作的核心,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),分别处理二进制和文本数据。常用类包括FileInputStream、FileWriter等,需注意资源关闭(推荐try-with-resources)。File类提供文件管理功能,支持创建(createNewFile())、删除(delete())、重命名(renameTo())等操作,但跨平台行为不一致,建议Java 7+的Files.move()替代。辅助方
2025-10-27 09:36:29
916
原创 Java基础:集合框架之 Map 接口
本文介绍了Java集合框架中的Map接口及其核心特性和实现类。主要内容包括:Map接口的继承体系(HashMap、LinkedHashMap、TreeMap等);核心操作方法(增删改查、批量操作等);键值对特性(键唯一、值可重复);常用遍历方式(entrySet推荐);典型实现类对比(有序性、线程安全等差异);以及使用注意事项(如重写hashCode和equals方法)。文章还提供了示例代码和最佳实践建议,帮助开发者根据场景选择适合的Map实现类(如并发场景用ConcurrentHashMap)。
2025-10-26 14:41:52
688
原创 Java基础:集合框架之【集合遍历】
Java集合遍历方式总结 Java集合框架提供了多种遍历方式,主要分为Collection和Map两类: Collection遍历 Iterator:通用且安全,支持遍历时删除元素 for-each循环:简洁易读(底层基于Iterator) 传统for循环:仅适用于List,支持索引访问 forEach()+Lambda:函数式风格,代码简洁 Stream API:支持链式操作和并行处理 Map遍历 entrySet():推荐方式,高效获取键值对 forEach()+Lambda:简洁的现代写法 keySe
2025-10-26 14:40:40
895
原创 Java基础:集合框架之 Collection 接口
Java集合框架中的Collection接口是单列集合的根接口,定义了基本操作方法。它包含三个主要子接口:List(有序可重复)、Set(无序不可重复)和Queue(队列)。Collection接口提供了添加、删除、查找等基本操作,以及批量操作和遍历方法。大多数实现类非线程安全,允许null元素。使用时需注意equals()和hashCode()重写、fail-fast机制及不同实现类的性能差异。掌握Collection及其子接口特性是使用Java集合框架的关键。
2025-10-26 14:29:04
517
【Linux操作系统】基础教程.pdf
2025-10-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅