- 博客(73)
- 收藏
- 关注
原创 Cookie、Session、Token、JWT 到底有什么区别?一文讲透四种身份认证方案
Token 直译是「令牌」,它不是一个具体技术,而是一段代表身份的字符串。服务端签发,客户端保存,每次请求放在请求头里带回来。Cookie解决的是「浏览器怎么自动带数据」;Session解决的是「服务端怎么记住你是谁」;Token解决的是「不依赖 Cookie 怎么传凭证」;JWT解决的是「怎么让凭证自包含、服务端不用存」。它们不是四选一的竞争关系,而是不同层次的工具。你的身份状态放在哪、由谁保管、怎么传递、能不能撤销。想清楚这四点,选型自然就清晰了。
2026-11-04 10:57:22
218
原创 项目中如何解决跨域问题:HttpClient、注解与网关三种方案
跨域不是后端「拒绝服务」,而是浏览器基于同源策略的安全机制。让响应头带上正确的 CORS 信息,且只在一处配置。单体应用用注解或全局配置快速解决;服务间 HttpClient 调用本身不受跨域限制,重点是透传与自测;微服务架构把 CORS 收敛到网关,配合去重过滤器避免响应头冲突。把这三点理清,跨域问题基本就不会再成为联调时的拦路虎。
2026-11-04 10:56:35
114
原创 Docker 网络模式详解:五种模式与选型实践
在同一个自定义网络中,容器可以直接用容器名这是因为 Docker 内置的嵌入式 DNS 服务会为自定义网络中的容器注册名称解析记录。自带 DNS 服务发现,无需关心容器 IP;网络隔离更清晰,不同业务用不同网络;支持在运行时动态接入/断开容器(是 Docker Compose 的默认行为,与编排工具天然契合。
2026-11-04 10:55:41
247
原创 Java 后端如何优雅地把 List 集合返回给前端
一个通用的Result<T>@Datareturn r;return r;隔离:用 VO 隔离实体,控制暴露字段;统一:用ResultPageResult统一响应结构,前端只写一套解析逻辑;规范:空集合、字段命名、日期格式、大整数精度,提前约定好。做到这三点,接口返回就从「能跑」升级为「好维护、好联调、好扩展」。
2026-10-27 10:32:42
244
原创 接口幂等性是什么?如何设计?
同一个请求被执行一次和执行多次,对系统产生的业务影响是一致的。换句话说,调用方因为超时、网络抖动、重试等原因重复提交了同一个请求,服务端最终的业务结果应当与只提交一次相同。幂等 ≠ 结果完全相同:多次调用返回的响应体可以不同(例如第二次返回“已处理”),但业务状态不能因为重复调用而再次变化。幂等 ≠ 并发安全:幂等解决的是“重复请求”问题,并发安全解决的是“同时请求”问题,两者常常需要配合使用。接口幂等性是分布式系统稳定性的基础保障。它的核心不是“防止请求重复到达”,而是“保证重复到达不产生副作用”
2026-10-27 10:32:07
231
原创 SpaceClaim 2026 R1 专业安装:从直接建模到仿真前处理的完整指南
用直接建模的方式,把几何从“能看”变成“能算”。它在交互效率、几何修复和求解器协同上的持续打磨,使其成为仿真驱动设计流程中不可替代的一环。如果你的工作涉及大量外部模型导入、几何清理或 CFD 前处理,SpaceClaim 值得作为重点工具投入学习;如果主要是规则化产品设计,则需评估其与现有参数化 CAD 的分工边界。
2026-10-27 10:30:28
382
原创 TCP 与 UDP 协议原理及区别详解
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它在发送数据之前,需要先在通信双方之间建立一条可靠的连接,然后才能传输数据。UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的、基于数据报的传输层协议。它不需要建立连接,直接将数据打包成数据报发送给对方,不保证数据一定到达、不保证顺序、也不做重传。
2026-10-21 10:55:42
78
原创 Hash 碰撞是什么?如何解决?
Hash 函数(散列函数)的作用是把任意长度的输入数据,通过某种算法映射成一个固定长度的输出值,这个输出值称为哈希值(Hash Value)或散列值。由于哈希值的长度是有限的,而输入数据的可能性是无限的,根据鸽巢原理(抽屉原理),必然存在两个不同的输入数据映射到同一个哈希值的情况。这种现象就称为Hash 碰撞(Hash Collision),也叫哈希冲突。输入 A(不同) ──┐├──→ 同一个哈希值(碰撞)输入 B(不同) ──┘不同的输入,得到了相同的输出,这就是 Hash 碰撞。解决方式。
2026-10-21 10:55:11
304
原创 Java 线程的状态及转换详解
NEW→RUNNABLE:调用start();RUNNABLE→BLOCKED:竞争锁失败;RUNNABLE→WAITING:调用wait()join()park();RUNNABLE→:调用sleep()等;所有非终止状态最终都会回到RUNNABLE或走向TERMINATED。理解这些状态转换,不仅能帮助你排查死锁、线程饥饿等问题,也是深入理解AQS、线程池等高级并发组件的前提。希望本文能帮你打下坚实的并发编程基础。
2026-10-21 10:54:38
302
原创 DO 和 AO 到底怎么选:比较器替你决定了什么
这里的「比较器」不是指Comparator接口,而是指对象之间的相等性比较逻辑——即equals()与hashCode()的实现方式。它决定了两个对象在集合去重、缓存命中、业务判等时是否被视为「同一个对象」。DO 和 AO 怎么选,表面上是「字段放哪」的问题,本质上是「对象如何判等」的问题。比较器替你决定了去重、缓存、幂等的语义边界——想清楚你的业务需要哪种相等性,选型自然就有了答案。这两个对象,什么情况下算「同一个」?答案会告诉你该用 DO 还是 AO。
2026-10-14 11:43:18
202
原创 把 AO 接回来:黑线和白底之间到底差了多少
传统密度计测量的是物理反射密度其中 R 是反射率。它不考虑人眼的视觉响应。同样 1.6 的密度,在亮光铜版纸和哑光纸上,人眼看起来的「黑」是完全不同的。黑线和白底之间到底差了多少?物理上可能差 1.6 以上,但人眼感知的 AO 差值通常在 0.9 ~ 1.8 之间,且受纸张、墨层、光泽度多重影响。把 AO 接回来,不是多此一举,而是让测量回归「人眼真实感受」这一本质。下次再遇到「黑得不够黑」的投诉,别急着加墨,先算一算 AO——你可能会发现,差值缩水的根源在纸张,而不是墨量。
2026-10-14 11:42:33
191
原创 JVS混合架构实践:能力引擎+动态模型
能力引擎沉淀稳定逻辑,保证系统的可靠性与复用性;动态模型承载易变结构,保证业务的灵活性与响应速度;两层协作通过配置化、事件化、服务化的方式实现,让业务调整不再依赖发版。在实践中,不必追求一步到位,可以从一个典型场景切入,逐步沉淀能力、完善模型,最终形成适合自身业务的混合架构体系。
2026-10-14 11:41:36
230
原创 IBM SPSS Statistics 27 全面解析:功能、亮点与应用场景
IBM SPSS Statistics 27 是一款功能全面、操作友好的统计分析工具,既适合初学者快速上手,也满足专业研究者的复杂分析需求。通过丰富的数据处理和建模能力,它能够帮助用户高效完成从数据整理到结果解读的完整分析流程。
2026-10-14 11:39:55
237
原创 Java 异常机制详解:从入门到实战
异常(Exception)是程序运行过程中出现的非正常情况。当程序遇到异常时,如果没有被正确处理,程序就会中断执行。Java 中的异常机制将错误处理代码从正常业务逻辑中分离出来,使代码更加清晰、可维护。在实际开发中,我们经常需要定义自己的异常类来更好地描述业务问题。// 自定义检查型异常// 自定义运行时异常throw new BusinessException("用户ID不能为空");// 模拟查询用户。
2026-10-10 11:04:27
168
原创 Java 并发同步系列之 AQS:从原理到实战
// 测试 public static void main(String [ ] args) throws InterruptedException {try {System . out . println(Thread . currentThread() . getName() + " 进入临界区");System . out . println(Thread . currentThread() . getName() + " 离开临界区");} };
2026-10-10 11:03:39
337
原创 Java 同步系列之 CountDownLatch 源码解析
允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。它通过一个计数器(count)来实现:初始化时设定一个计数值,每当一个线程完成任务后调用方法使计数器减一,当计数器减到零时,所有等待的线程被唤醒并继续执行。是 Java 并发编程中一个轻量而强大的同步工具。它基于 AQS 的共享锁模式实现,核心逻辑集中在内部类Sync。await()通过判断是否需要阻塞等待。通过 CAS 循环递减计数器,归零时唤醒所有等待线程。它是一次性的,适合"等待完成"场景,与形成互补。理解。
2026-10-10 11:02:24
217
原创 C语言篇:语法进阶
int age;strcpy(s1.name, "张三");printf("姓名: %s, 年龄: %d, 成绩: %.1f\n", s1.name, s1.age, s1.score);return 0;#define PI3.14159// 25// 25// 25// 25// 25// 25// 25// 3.14// 25语法进阶是 C 语言学习的分水岭。掌握指针、动态内存、结构体和文件操作后,你就具备了编写真实项目的能力。
2026-10-05 10:12:05
188
原创 C语言篇:复合字面量
复合字面量(Compound Literal)是 C99 标准引入的一种语法特性,它允许在表达式中直接构造一个临时的结构体、数组或联合体对象,而无需先声明一个具名变量。简单来说,它就是一个“匿名的、临时的”对象,在需要的地方直接写出来,用完即弃。(类型){初始化列表}例如,下面这行代码就创建了一个匿名的int数组,并把它赋值给指针p这里在需要临时对象的地方直接构造,让代码更紧凑、可读性更高,尤其适合作为函数实参、初始化结构体字段等场景。int x;int y;} Point;
2026-10-05 10:11:22
324
原创 C语言篇:可变参数函数
/ 日志级别LOG_INFO,LOG_WARN,LOG_ERROR// 获取当前时间// 级别名称break;break;break;break;// 打印前缀// 处理可变参数va_list ap;// vprintf 直接配合 va_list 使用va_end(ap);log_message(LOG_INFO, "系统启动,端口 %d", 8080);log_message(LOG_WARN, "内存使用率偏高: %.1f%%", 85.5);
2026-10-05 10:10:27
319
原创 Carsim 2024.1 专业安装介绍:功能特性与应用场景详解
Carsim 2024.1 在车辆动力学仿真精度、智能驾驶场景支持以及联合仿真接口方面均有明显提升,能够覆盖从整车性能开发到自动驾驶算法验证的完整研发链条。无论是企业工程师还是高校研究人员,都可以借助该平台高效开展仿真工作。
2026-10-05 10:09:05
232
原创 Lua 中使用 C 语言的用户自定义类型——userdata
userdata是 Lua 中一种特殊的类型,用于表示 C 语言中任意类型的数据。它本质上是一块内存区域,Lua 本身不关心这块内存的具体内容,而是将其视为一个不透明的指针来管理。userdata完整 userdata(full userdata):由 Lua 分配和管理内存,可以包含任意大小的数据块。轻量 userdata(light userdata):仅包装一个 C 指针,不参与 Lua 的内存管理。userdata。
2026-10-01 09:58:35
150
原创 适合初学者练习的 C/C++ 开源项目推荐
难度项目语言核心学习点入门TinyhttpdC网络编程、多线程入门CJSONC指针、数据结构入门2048 游戏C数组、状态机进阶SQLiteCB-Tree、SQL 解析进阶RedisC事件驱动、数据结构进阶LevelDBC++RAII、跳表挑战Linux 内核C操作系统核心挑战FFmpegC音视频、模块组织挑战C++张量、算子调度选择项目时,建议遵循「跳一跳够得着」的原则:选一个比当前水平略高、但又不至于完全看不懂的项目。
2026-10-01 09:57:21
267
原创 理解头文件与库文件
头文件是以.h.hpp等为后缀的文本文件,用于声明函数、类、宏、常量、全局变量等接口信息。它本身通常不包含实现代码,而是告诉编译器「这些接口存在,且签名是什么」。库文件是将一组相关的目标代码(编译后的机器码)打包而成的文件,供链接器在链接阶段使用。库文件是「实现」的载体,头文件只是「声明」的载体。头文件负责「声明接口」,库文件负责「提供实现」。编译时依赖头文件,链接时依赖库文件。理解这两者的分工与配合,是掌握 C/C++ 构建流程的关键一步。
2026-10-01 09:54:51
205
原创 C语言内存管理:从指针到内存泄漏的全面指南
C语言内存管理是每个C程序员必须掌握的核心技能。内存分区模型:栈、堆、全局区等不同区域的特性。动态分配函数malloccallocreallocfree的用法与区别。常见错误:内存泄漏、悬空指针、重复释放、缓冲区溢出等。最佳实践:成对分配释放、检查返回值、释放后置空、使用检测工具。进阶技巧:内存池、引用计数、智能指针模拟。掌握这些知识,你就能写出更安全、更高效的C程序。内存管理没有银弹,细心和规范才是最好的工具。
2026-10-01 09:53:51
291
原创 Java 类型转换详解:从基础到实战
类型转换(Type Casting)是指将一种数据类型的值转换为另一种数据类型的过程。Java 是强类型语言,每个变量和表达式在编译时都有明确的类型,但在某些场景下,我们需要将一种类型的值当作另一种类型来使用,这时就需要进行类型转换。基本类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean。
2026-09-20 11:19:38
67
原创 Java 布尔型(boolean)详解:从基础到实战
true(真)和false(假)。布尔型主要用于逻辑判断和条件控制,是程序流程控制的核心基础。布尔型虽然简单,却是 Java 程序逻辑判断的基石。掌握它的声明、赋值、逻辑运算以及与条件语句、循环语句的配合使用,是编写高质量 Java 代码的第一步。
2026-09-20 11:17:44
155
原创 Java 浮点型详解:float 与 double 的精度陷阱与实战
场景推荐类型原因科学计算、工程计算double精度较高,性能好金额、价格等货币计算BigDecimal精确十进制运算节省内存(如大量数组存储)float占用空间小一般业务数值double默认浮点类型,精度足够Java 浮点型是日常开发中不可或缺的基础类型,但它的精度问题也是最容易踩坑的地方。float占 4 字节,double占 8 字节,double精度更高。浮点数基于 IEEE 754 标准存储,二进制无法精确表示大部分十进制小数。比较浮点数不要用==,应使用误差范围或。
2026-09-20 11:17:10
167
原创 Enscape 4.5 全面解析:功能升级、安装配置与实战应用指南
Enscape 4.5 是 实时渲染插件最新版本,专为建筑、室内设计和景观规划等领域的专业人士打造。它无缝集成于 SketchUp、Revit、Rhino、Archicad 和 Vectorworks 等主流建模软件中,让设计师能够在建模过程中即时获得照片级渲染效果,无需漫长的等待。Enscape 4.5 在上一代版本的基础上,进一步优化了渲染性能、材质系统和光照算法,同时新增了多项实用功能,帮助设计师更高效地完成方案推敲、效果图输出和沉浸式漫游体验。
2026-09-20 11:15:12
105
原创 PATH 环境变量详解:从原理到实战
PATH 是操作系统中的一个环境变量,它告诉系统在哪些目录中查找可执行程序。当你在终端输入一个命令(如lspythonjava)时,系统会按照 PATH 变量中列出的目录顺序,依次在这些目录中查找对应的可执行文件。简单来说,PATH 就是系统查找命令的"搜索路径列表"。PATH 环境变量是操作系统运行命令的基础机制。快速调用各类开发工具。灵活管理多个软件版本。自定义全局命令,提升开发效率。配置 PATH 时,牢记"保留原有路径、注意目录顺序、配置后重新加载"三个要点,就能避免绝大多数常见问题。
2026-09-16 10:31:03
80
原创 HelloWorld 程序的编写:从零开始的第一个程序
HelloWorld 程序最早出自 1978 年出版的《The C Programming Language》一书,由 Brian Kernighan 在示例中首次使用。此后,它逐渐成为编程语言教程中的惯例开篇示例。验证开发环境是否配置正确熟悉代码文件的创建与保存掌握程序从源码到运行的完整流程建立对语言基础语法的第一印象HelloWorld 虽然代码量极少,却是理解编程语言运行机制的最佳起点。通过亲手完成环境搭建、代码编写、编译运行这一完整闭环,你已经迈出了编程之路的第一步。
2026-09-16 10:30:32
182
原创 JDK、JRE、JVM 三者关系详解:从入门到彻底搞懂
JDK 包含 JRE,JRE 包含 JVM。JVM是执行字节码的虚拟机,是 Java 跨平台特性的基石;JRE是运行 Java 程序的环境,包含 JVM 和核心类库;JDK是开发 Java 程序的工具包,包含 JRE 和开发工具。对于开发者来说,只需安装 JDK 即可满足开发与运行的全部需求。理解了这三者的关系,你就迈出了 Java 学习路上坚实的一步。
2026-09-16 10:30:02
152
原创 深入理解 Java 中的 volatile 关键字
volatile是 Java 并发编程中一个重要的关键字,它通过保证可见性和禁止指令重排序,为多线程环境下的共享变量提供了一种轻量级的同步方案。但它并不保证原子性,因此在使用时需要根据具体场景谨慎选择。理解volatile的原理与局限,有助于我们写出更健壮的并发代码。
2026-09-10 12:10:41
234
原创 重排序与 happens-before:Java 并发编程的基石
重排序是指编译器和处理器为了优化程序性能,在不改变单线程程序语义(即单线程执行结果)的前提下,对指令执行顺序进行重新排列的一种手段。规则是 JMM 的核心,它为程序员提供了跨线程的内存可见性保证。理解重排序与重排序是性能优化的手段,但受数据依赖性和语义约束;是内存可见性的保证,它不禁止重排序,只要求结果可见;正确同步的程序具有顺序一致性,不会出现数据竞争。掌握这些规则,你就能在享受并发性能提升的同时,写出线程安全的代码。
2026-09-10 12:09:22
257
原创 线程间的通信
线程间的通信是多线程编程的核心能力。:最基础,但使用需谨慎。:更灵活,支持分组等待。:最简洁,推荐优先使用。volatile:适合简单的状态标志。原子类:适合计数器等单变量场景。在实际开发中,优先选择高层抽象(如),只有在需要精细控制时才使用底层机制。理解每种方式的原理和适用场景,才能写出既高效又安全的多线程程序。
2026-09-10 12:08:34
287
原创 FLOEFD 2606 安装使用指南教程
FLOEFD 2606 为设计工程师提供了一套易用且高效的 CFD 仿真解决方案,能够在产品开发早期阶段提供可靠的热流分析结果,是电子散热和流体设计领域的重要工具。通过 CAD 原生集成、智能网格和参数化研究等特性,它大幅降低了 CFD 仿真的使用门槛,使热流分析真正成为设计流程中的常规环节。对于希望在保证产品可靠性的同时缩短研发周期、降低样机测试成本的团队而言,FLOEFD 2606 是一个值得重点评估的仿真平台。
2026-09-10 12:07:25
321
原创 Java OutputStreamWriter 详解:从字符到字节的桥梁
位于java.io包中,继承自Writer是 Java I/O 体系中连接字符流与字节流的重要桥梁。字符流与字节流的区别的四种构造方式常用方法及其使用场景内部工作原理实际编码中的注意事项在实际开发中,合理使用并配合,能够高效、安全地处理文本数据的输出。希望本文能帮助你更好地理解和使用这个重要的转换流。
2026-09-07 10:34:02
161
原创 Java InputStreamReader 详解:从字节流到字符流的桥梁
是 Java I/O 体系中连接字节流与字符流的关键桥梁。通过它,我们可以方便地按字符读取文本数据,并通过指定字符集避免乱码问题。在实际开发中,通常与搭配使用,以提升读取效率并支持按行读取。掌握的使用,是深入理解 Java I/O 编程的重要一步。希望本文能帮助你更好地理解和使用这个类。
2026-09-07 10:32:52
308
原创 Java Writer 详解:字符输出流的核心用法与实战
Writer是java.io包中的一个抽象类,它定义了字符输出流的基本行为。面向字符:以char(16 位 Unicode 字符)为基本单位进行写入。自动编码:在写出时,内部会将字符按指定字符集编码为字节。丰富的方法:提供写入单个字符、字符数组、字符串等多种重载方法。Writer是 Java 字符输出流的基石,理解它的核心方法、常用子类以及最佳实践,能够帮助你在日常开发中高效、安全地处理文本输出。Writer面向字符,自动处理编码,适合文本输出。常用子类包括FileWriter和。
2026-09-07 10:31:49
296
原创 Java Reader 详解:从基础到实战
为字符流提供缓冲,显著提升读取效率,并提供readLine()方法按行读取。:将转换为Reader,可指定字符集。FileReader的子类,专门用于读取文件,使用平台默认编码。:从字符数组读取数据,常用于测试。:从字符串读取数据,常用于解析字符串内容。Reader是 Java 字符输入流的基石,掌握它的继承体系和常用实现类,是编写健壮文本处理代码的前提。读取文本文件优先使用包装FileReader;需要指定编码时,使用并显式传入Charset;
2026-09-07 10:31:08
293
原创 Java 迭代器接口详解:从 Iterator 到 ListIterator 的完整指南
Iterator接口位于java.util包中,是 Java 集合框架的根接口之一。它提供了一种统一的方式来遍历集合中的元素,屏蔽了不同集合底层实现的差异。// 判断是否还有下一个元素E next();// 返回下一个元素// 是否有前一个元素// 返回前一个元素// 返回下一个元素的索引// 返回前一个元素的索引// 替换最后返回的元素// 在当前位置插入元素fail-fast(快速失败)是 Java 集合框架的一种错误检测机制。当多个线程同时对集合进行结构性修改时,迭代器会立即抛出。
2026-09-05 09:57:00
387
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅