自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 hashCode() 相同,equals() 就一定为 true 吗?

如果自己重写hashCode()@Override// 错误示范:所有对象哈希都相同return 1;@Override上面这个hashCode()让所有User对象的哈希值都是1equals()却按name和age判断。哈希全部相同,但绝大多数对象并不相等,同时HashMap会退化成链表,性能急剧下降。场景是否成立equals()为true→hashCode()相同✅ 必须成立hashCode()相同 →equals()为true❌ 不一定成立equals()为false→。

2026-11-10 10:40:26 259

原创 == 和 equals 的区别是什么?

=是运算符,基本类型比数值,引用类型比地址。equals是方法,默认比地址,重写后比内容。字符串、包装类比较内容时用equals,并注意把常量放在前面或使用避免 NPE。自定义类重写equals时,务必同时重写hashCode。

2026-11-10 10:39:57 193

原创 为什么要用多线程?公司项目中用到了哪些场景?

为什么要用多线程?因为单线程无法同时利用多核算力,也无法在等待 IO 时继续干活,更无法保证高并发下的响应速度。多线程的本质,是让"计算"和"等待"重叠,让硬件资源被更充分地利用。公司项目里用到了哪些场景?最典型的是:Web 请求处理、接口聚合并行调用、批量数据分片处理、非核心链路异步化、定时任务并行、后台守护线程、并行计算。它们的共同特征是——存在可以并行处理的独立子任务,或者存在大量 IO 等待时间。多线程是手段,不是目的。先找到瓶颈,再决定是否并发。

2026-11-04 11:40:28 312

原创 Cookie、Session、Token、JWT 到底有什么区别?一篇讲透

做 Web 开发,几乎绕不开「登录状态怎么保存」这个问题。Cookie是浏览器端的存储与传输机制;Session是服务端的会话状态;Token是一种「凭证」的抽象说法;JWT是 Token 的一种具体格式标准。很多人把它们混为一谈,是因为它们经常组合使用,比如「Cookie 里存 SessionId」「Cookie 里存 JWT」。本文按「是什么 → 怎么工作 → 优缺点 → 适用场景」的顺序逐个拆解,最后给出一张对比表和选型建议。

2026-11-04 11:39:36 184

原创 Java 中的回调机制:从接口、匿名类到 Lambda 与函数式接口

回调(Callback)是一种反向调用的设计思想:调用方把一段逻辑(通常是一个对象或函数)作为参数传给被调用方,被调用方在合适的时机再回过头来执行这段逻辑。用一句话概括:我不关心你什么时候做完,我只告诉你「做完之后该干什么」。在 Java 中,回调并不是语言层面的关键字,而是通过接口 + 多态实现的。回调的本质是面向接口编程。回调接口(Callback Interface):定义回调方法的契约。回调实现者(Callback Implementor):实现回调接口,提供具体逻辑。

2026-10-27 11:11:13 143

原创 常用 MySQL 分库分表方案详解

分库分表是解决单机 MySQL 容量与并发瓶颈的有效手段,但它把简单问题变成了分布式问题。落地前应确认垂直拆分、读写分离、缓存等手段已经用尽,落地后要同步规划好跨分片查询、分布式事务、全局 ID、数据迁移等配套能力。选型上,ShardingSphere 生态是目前国内最主流、文档最完善的选择,适合作为大多数团队的起点。

2026-10-27 11:10:34 273

原创 Java 中 new 一个对象的完整流程

new一个对象看似简单,背后却串联了类加载、内存分配、并发控制、对象布局和构造方法调用等多个 JVM 核心机制。把这条链路理清楚,不仅能应对面试,也能在排查内存问题、性能问题时更有底气。一句话概括:new负责"造壳",<init>负责"填肉",两者合起来才是一个完整的对象。

2026-10-27 11:10:00 307

原创 过滤器与拦截器:从原理到实战的全面对比

过滤器是 Servlet 规范中定义的一种组件,它位于客户端请求与 Servlet 之间,能够在请求进入 Servlet 之前进行预处理,并在响应返回客户端之前进行后处理。过滤器由 Servlet 容器(如 Tomcat)负责创建和管理,其生命周期由容器掌控。拦截器是 Spring MVC 框架提供的功能,它基于 AOP(面向切面编程)思想实现,作用于 Spring MVC 的处理器(Handler)执行前后。拦截器由 Spring 容器管理,可以访问 Spring 上下文中的 Bean。

2026-10-21 11:41:28 287

原创 Java反射和new效率对比,差距有多大?

维度直接new反射性能极快(约 2.5 ns)慢约 20 倍(约 45 ns)灵活性编译期固定运行时动态适用场景普通业务代码框架、工具库、动态代理可读性高较低核心结论:反射确实比new慢约 20 倍,但这个差距在绝大多数业务场景中微不足道。选择反射还是new,应该以是否需要运行时动态性为判断标准,而不是性能。如果确实在热点路径使用反射,通过缓存、使用等方式可以大幅缩小性能差距。

2026-10-21 11:40:51 316

原创 Altium Designer 26 深度解析:新一代 PCB 设计平台全指南

Altium Designer 26 是一款面向现代电子研发的综合性 PCB 设计工具,适合从个人开发者到中大型硬件团队的不同规模使用。它在统一环境、高速设计、协同与制造交付方面的持续投入,使其成为当前 PCB 设计领域值得关注的选择。

2026-10-21 11:39:53 92

原创 事务能回滚吗?Pipeline 算事务吗?

原子性(Atomicity):要么全部成功,要么全部失败,不存在中间状态。一致性(Consistency):事务执行前后,数据始终满足完整性约束。隔离性(Isolation):并发事务之间互不干扰。持久性(Durability):事务一旦提交,结果永久保存。只有满足 ACID 的操作集合,才能被称为严格意义上的事务。Pipeline(管道/流水线)是一种数据处理模式,把一系列步骤串联起来,前一步的输出作为后一步的输入。dfPipeline 强调的是数据流的传递与变换,它本身并不承诺 ACID。

2026-10-14 12:10:45 260

原创 Redis Cluster 的 16384 个槽(Slot)是什么?

16384 这个数字并不是随便定的,它背后有性能和内存两方面的考量。每个 key 通过定位到唯一槽;每个 master 负责一部分槽;槽的迁移就是集群扩容、缩容和再平衡的核心手段;16384 这个数字,是官方在迁移粒度、心跳包大小和内存开销之间权衡后的最佳选择。理解了槽,你就理解了 Redis Cluster 的数据分布与扩缩容原理。

2026-10-14 12:08:35 93

原创 分布式锁怎么写才不算裸奔?

维度裸奔写法正确写法加锁SETNX不带过期时间原子加锁 + 过期时间 + 唯一 value解锁直接deleteLua 脚本校验 value 后删除过期锁过期就完事看门狗定期续期高可用单点 Redis主从/集群 + 必要时 RedLock除非是学习目的,否则不要自己造轮子。直接用 Redisson 或 Curator,把精力放在业务本身,才是生产环境最稳妥的选择。

2026-10-14 12:08:06 298

原创 Key 过期了,是马上删掉的吗?

策略触发时机优点缺点惰性删除访问 Key 时节省 CPU过期 Key 可能残留内存定期删除周期性扫描缓解内存残留仍可能有短暂残留Key 过期了,并不是马上删掉的,而是通过惰性删除 + 定期删除配合,在「被访问时」或「周期性扫描时」才真正从内存中移除。

2026-10-14 12:07:23 172

原创 什么是范数?用 NumPy 动手算一遍

非负性:\( \|\mathbf{x}\| \geq 0 \),且 \( \|\mathbf{x}\| = 0 \) 当且仅当 \( \mathbf{x} = \mathbf{0} \)。齐次性三角不等式这三条性质保证了范数确实是一种合理的“长度度量”。不过在实际应用中,我们通常不需要每次都验证这三条,而是直接使用几种经典的范数公式。范数是一个既简单又强大的工具。简单在于它的直觉——度量“大小”;强大在于它衍生出的各种形式,能灵活应对不同场景。

2026-10-10 11:30:26 260

原创 Docker 部署 Dolibarr:从零开始的完整指南

通过 Docker Compose,我们快速完成了 Dolibarr 的部署,并实现了数据库持久化、反向代理、备份恢复与平滑升级。这套方案具备良好的可移植性,可以轻松迁移到任何支持 Docker 的服务器上。后续你可以进一步探索 Dolibarr 的模块配置、多语言支持以及与其他系统的集成,让这套 ERP/CRM 系统真正服务于业务。

2026-10-10 11:29:01 166

原创 Spring Boot 2.1 → 3.5 迁移推演:从实战出发的完整路线图

Spring Boot 2.1 → 3.5 的迁移是一次系统性工程,核心难点集中在 Jakarta 命名空间切换、Java 版本升级、Spring Security 重构和第三方依赖兼容四个方面。建议遵循「先 2.7、再 3.5」的两步走策略,配合自动化测试与灰度发布,将风险控制在可接受范围内。迁移完成后,你将获得更长的社区支持周期、更强的安全性与更现代的编程体验。

2026-10-10 11:28:12 303

原创 NREC MAX PAC 2026:新一代工业自动化控制平台全解析

NREC MAX PAC 2026 是 专业级自动化控制平台,面向工业自动化、过程控制与智能装备领域,提供高性能、高可靠性的控制解决方案。该平台集成了先进的控制算法、灵活的组态工具和强大的通信能力,适用于从单机设备到复杂生产线的多种应用场景。NREC MAX PAC 2026 凭借强大的处理性能、灵活的扩展能力和完善的软件生态,为工业自动化领域提供了高效可靠的控制平台。无论是新建项目还是旧系统升级,该产品都能帮助用户提升生产效率、降低运营成本,是值得关注的下一代自动化控制解决方案。

2026-10-10 11:25:46 197

原创 常用的 Git 小技巧

以上是日常开发中非常实用的 Git 小技巧,覆盖了提交、撤销、分支、日志、暂存等常见场景。掌握这些技巧,可以让你的 Git 操作更加高效。建议在实际项目中多加练习,逐步形成自己的命令习惯。

2026-10-05 11:00:52 130

原创 SSH 连接本地 VMware 内的虚拟机:从零到通的完整指南

选择合适的网络模式(推荐 NAT)。获取虚拟机 IP。在虚拟机内安装并启动 OpenSSH Server。放行防火墙 22 端口。在宿主机执行ssh 用户名@IP连接。掌握这套流程后,你就能像操作远程服务器一样高效地管理本地虚拟机,配合 VS Code Remote-SSH、Xshell 等工具,开发体验会大幅提升。

2026-10-05 11:00:19 356

原创 Spring AOP 失效排查:从原理到实战的完整指南

Spring AOP 失效问题虽然常见,但只要理解了动态代理的原理,排查起来并不困难。自调用是最高频的失效原因,务必通过代理对象调用;切点表达式要仔细核对包名、类名和方法签名;切面类必须被 Spring 容器管理;final / static 方法无法被 CGLIB 代理;代理方式配置要与目标类结构匹配。掌握这些要点,再配合系统化的排查步骤,绝大多数 AOP 失效问题都能在几分钟内定位并解决。希望本文能帮助你在实际项目中少走弯路。

2026-10-05 10:59:27 311

原创 什么是 I/O 虚拟化

I/O 虚拟化是虚拟化技术中承上启下的关键一环,它决定了虚拟机访问外部设备的速度与安全边界。从软件模拟到半虚拟化,再到硬件辅助的 SR-IOV,演进的主线始终是「减少 Hypervisor 的介入、让虚拟机更直接地访问硬件」。在实际生产环境中,往往不是只用某一种方式,而是根据业务对性能和兼容性的要求,混合使用多种 I/O 虚拟化模型。

2026-10-03 09:43:23 268

原创 Go 语言循环详解:从基础语法到实战技巧

Go 语言的循环设计简洁统一,仅用for关键字即可覆盖所有循环场景。掌握for的三种形态、breakcontinue控制语句、range遍历技巧以及常见陷阱,就能在实战中灵活运用循环写出高效、健壮的 Go 代码。建议读者动手运行本文中的示例代码,加深理解。

2026-10-03 09:42:21 191

原创 C 与 Go 语言对比:从设计哲学到工程实践

C 与 Go 并非简单的替代关系,而是面向不同问题的解决方案。C 追求极致的性能与硬件控制力,适合底层系统开发;Go 追求开发效率与工程化便利,适合现代云原生应用。选择哪种语言,取决于你的应用场景、性能要求与团队技术栈。若你正在开发操作系统或嵌入式系统,C 是必然之选;若你在构建微服务或云原生基础设施,Go 将是更高效的选择。

2026-10-03 09:41:39 425

原创 SIMATIC WinCC 8.1 专业安装详细介绍

SIMATIC WinCC 8.1 是一款功能全面、性能稳定、扩展灵活的工业监控软件,能够满足从单机设备到大型分布式工厂的多种监控需求。通过其强大的组态工具、可靠的数据处理和开放的集成接口,WinCC 8.1 为工业自动化项目的实施与运维提供了高效、安全的解决方案,是推进智能制造和数字化转型的重要基础平台。

2026-10-03 09:40:13 189

原创 TCP/IP 网络编程:多播与广播

广播实现简单,但只限于局域网,且会打扰子网内所有主机;多播更高效、可控,能够跨路由器传播,但需要接收端主动加入多播组。在实际开发中,应根据业务范围与网络环境选择合适的方案:局域网内的设备发现可以优先考虑广播,而需要跨网段、面向特定群体的数据分发则应使用多播。

2026-10-01 10:31:00 270

原创 模拟实现库函数 strcpy 之梅开 n 度

模拟实现strcpy指针运算与自增自减的优先级;赋值表达式的值;const限定符的作用;返回值设计的意义;内存重叠与缓冲区安全。从第一度的朴素实现,到第五度的安全考量,每一次「梅开」都让代码更接近标准库的严谨。建议读者自己动手,把每一版都敲一遍,并思考:如果去掉const、如果不用返回值、如果遇到重叠,会发生什么?

2026-10-01 10:29:09 213

原创 深入理解 ioctl 系统调用:从原理到实战

ioctl是 Linux 提供的一个通用系统调用,用于向设备发送控制命令。它的原型定义在fd:文件描述符,指向已打开的设备文件。request:设备相关的请求码,用于标识要执行的操作。...:可变参数,通常是一个指向内存的指针,用于传递数据或接收结果。与readwrite专注于数据流传输不同,ioctl更侧重于控制——设置终端属性、调整音量、配置网卡 IP 等操作,都可以通过ioctl完成。int value;

2026-10-01 10:27:53 161

原创 cJSON 源码解析:parse_string 函数深入剖析

两遍扫描:先统计长度再分配内存,兼顾效率与精确性。无转义快路径:对不含转义的字符串使用memcpy批量复制,避免逐字符开销。完整的转义支持:覆盖 JSON 规范定义的所有标准转义,并正确处理 Unicode 代理对。严谨的错误处理:每个失败路径都释放内存,避免泄漏。理解的实现,不仅能帮助你深入掌握 cJSON 的工作原理,也能为阅读其他 JSON 解析库(如 yyjson、jansson)的字符串处理逻辑打下良好基础。

2026-09-30 10:43:31 340

原创 C 语言 | 在函数中操作数组

数组作为指向其第一个元素的指针传递给函数。函数内部的修改会影响原始数组。始终单独传递数组的大小。使用const保护只读数组。对于多维数组,除第一维外,必须指定所有维度。掌握在函数中操作数组是编写简洁高效 C 代码的关键一步。

2026-09-30 10:42:39 168

原创 Ubuntu 搭建 APUE 环境:从源码编译到第一个示例跑通

UNIX 环境高级编程》(Advanced Programming in the UNIX Environment,简称 APUE)是学习 Unix/Linux 系统编程的经典书籍。本文以 Ubuntu 为例,从安装依赖、获取源码、编译库,到跑通第一个示例,一步步带你完成 APUE 环境的搭建。接下来就可以对照书中章节,逐个编译运行示例,深入理解 Unix 系统编程的各个主题了。库,因此动手实践的第一步,就是在自己的机器上把这本书的配套环境搭建起来。是社区维护的镜像,与官方源码一致。

2026-09-30 10:41:45 188

原创 移植 OLLVM 到 LLVM 18:从源码构建到自定义混淆 Pass

编写测试程序test.cc = c * 2;return c;// 1. 保存原始入口块// 2. 创建分发器块// 3. 创建状态变量// 4. 遍历所有基本块,分配状态值并改写跳转// ...(此处省略详细实现)移植 OLLVM 到 LLVM 18 的核心工作集中在三方面:Pass 框架从旧版迁移到新 Pass 管理器、适配 LLVM 18 的 API 变更(属性、IRBuilder、迭代器等)、以及重新设计构建脚本。

2026-09-30 10:41:08 242

原创 C语言与C++在基础语法上的区别

C语言中,函数原型可以省略参数列表(表示接受任意参数),且空参数列表()在C中表示接受任意参数。// C语言// 表示接受任意参数(旧式风格)// 表示不接受任何参数C++中,()明确表示不接受任何参数,且不允许省略参数列表。// C++// 明确表示不接受任何参数对比维度C语言C++变量声明位置通常集中在块首可随时就近声明初始化方式赋值支持列表初始化{}函数重载不支持支持默认参数不支持支持输入输出printfscanfcoutcin字符串char[]+ 库函数。

2026-09-29 09:38:27 366

原创 Corona 14.0 for C4D R17-2026 渲染插件安装

Corona 14.0 for Cinema 4D R17-2026 是一款功能全面、性能出色的渲染器版本,它在兼容性、渲染速度、材质表现和工作流程方面都达到了较高水准。无论是建筑可视化从业者、产品设计师还是动画师,都能借助 Corona 14.0 高效产出高质量的三维作品。建议用户根据自身 C4D 版本选择合适的安装包,并在正式项目前进行充分的测试渲染,以发挥其最佳性能。

2026-09-29 09:36:16 280

原创 C语言内存管理:从栈到堆的完整指南

栈上自动、堆上手动、指针要小心。栈内存由编译器自动管理,速度快但容量有限,适合生命周期短的局部变量。堆内存由开发者手动管理,灵活但需要严格遵守分配与释放的配对原则。指针是内存管理的核心工具,也是大多数错误的根源,务必警惕悬垂指针、双重释放和缓冲区溢出。掌握内存管理不是一蹴而就的,建议在实战中多使用 Valgrind 和 AddressSanitizer 等工具辅助排查,逐步培养「分配必释放、释放必置空」的编码习惯。当你能够熟练驾驭内存时,也就真正掌握了C语言的精髓。

2026-09-27 09:28:58 321

原创 C++ 与 Lua 的协程交互:从原理到实战

协程是一种用户态轻量级线程,它由程序员显式控制挂起(yield)与恢复(resume),不依赖操作系统内核调度。与线程不同,协程在同一时刻只有一个在执行,因此无需考虑数据竞争与锁问题。:创建一个协程,参数为协程主体函数。:恢复(或首次启动)协程,可传入参数。:挂起当前协程,可向外传递返回值。:查询协程状态(suspended / running / normal / dead)。:以函数形式封装协程,更简洁。C++ 与 Lua 的协程交互,本质上是围绕lua_resumelua_yieldk。

2026-09-27 09:27:59 458

原创 C语言平均分问题详解:从入门到实战

使用变量累加求平均的基础方法;使用数组与循环处理批量数据;使用动态内存分配处理不确定人数;在求平均的同时扩展统计功能;避免整数除法等常见陷阱。建议读者动手实践,尝试将上述代码进行组合与扩展,例如增加成绩排序、统计各分数段人数等功能,进一步巩固C语言基础。

2026-09-26 09:34:01 218

原创 C语言素数判断:从入门到进阶

素数(又称质数)是指大于 1的自然数中,除了 1 和它本身以外不再有其他因数的数。例如 2、3、5、7、11 都是素数,而 4、6、8、9 都不是素数。判断一个数是否为素数,是 C 语言初学者最经典的练习题目之一,也是后续学习算法优化、数论的基础。方法时间复杂度适用场景基础试除法O(n)小数字、教学演示试除到 √nO(√n)单个数字判断跳过偶数优化O(√n/2)单个数字判断(推荐)埃拉托斯特尼筛法批量判断大量数字。

2026-09-26 09:33:14 201

原创 Python 新手学习多久才能学会?

在讨论时间之前,首先要搞清楚「学会」到底指什么。入门级:能看懂 Python 基础语法,能写简单的脚本处理日常任务。应用级:能独立完成一个小项目,比如爬虫、数据分析脚本、自动化办公工具。就业级:能胜任 Python 开发岗位,熟悉框架、工程化开发、代码规范等。目标不同,所需时间自然天差地别。建议你先明确自己的学习目的,再制定时间预期。Python 新手学习多久学会?答案是:入门约 1~2 个月,能独立做项目约 3~6 个月,达到就业水平约 6~12 个月。但更重要的是,学习编程是一场长跑。

2026-09-25 09:58:31 208

原创 Python 学习分哪些步骤?一份从入门到进阶的完整路线图

Python 学习没有捷径,但有清晰的路径。按照「基础语法 → 进阶思维 → 工程化工具 → 方向深耕 → 项目实战」五个阶段循序渐进,每一步都动手写代码、做练习,你就能稳步从新手成长为合格的 Python 开发者。多写、多读、多问、多总结,是学好 Python 的不二法门。

2026-09-25 09:57:46 208

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除