- 博客(35)
- 收藏
- 关注
原创 Java自定义协议的发布订阅式消息队列(二)
本文介绍了消息队列系统的数据库设计与实现。使用SQLite数据库持久化保存交换机(Exchange)、消息队列(MSGQueue)和绑定关系(Binding)。通过MetaMapper接口及其XML映射文件实现CRUD操作,包括建表、增删改查等。DataBaseManager类整合数据库操作,并实现初始化数据库、创建默认数据等功能。文中还详细描述了针对各个功能的单元测试用例,包括数据库初始化、交换机操作、队列操作和绑定关系操作等测试场景。测试采用JUnit框架,确保每个测试用例独立运行,并通过断言验证操作结
2025-12-07 11:11:42
1007
原创 Java自定义协议的发布订阅式消息队列(一)
本文介绍了基于RabbitMQ的消息队列模拟实现方案。首先阐述了项目背景,说明了生产者消费者模型在后端开发中的重要性,以及将阻塞队列封装为独立消息队列服务器的必要性。随后详细分析了核心需求,包括生产者、消费者、中间人等核心概念,以及交换机、队列、绑定等关键组件。文章重点描述了项目创建过程,包括Exchange、MSGQueue、Binding、Message等核心类的设计与实现,特别针对Map类型数据的持久化问题提出了解决方案。整个系统设计涵盖了消息队列的基本功能,包括交换机类型处理、消息持久化、网络通信等
2025-12-04 22:16:01
726
原创 Mybatis操作数据库(进阶)
本文介绍了MyBatis动态SQL的核心特性及应用场景,主要包括: 常用动态SQL标签:<if>处理非必填字段、<trim>处理多选填项、<where>构建条件查询、<set>实现动态更新、<foreach>处理集合操作、<include>复用SQL片段。 实战案例:基于MyBatis重构表白墙项目,实现数据持久化存储,包含数据库准备、依赖配置、实体类与Mapper接口实现等完整流程。 开发工具: MyBatis Generator插件
2025-11-14 21:52:23
697
原创 Mybatis操作数据库(入门)
本文介绍了MyBatis持久层框架的基础使用。内容包括:1) MyBatis简介及基本配置方法;2) 注解方式实现CRUD操作;3) XML配置方式实现复杂查询;4) #{}和${}参数传递的区别,以及预编译SQL的优势;5) 排序和模糊查询的实现技巧。文章通过创建用户表示例,详细演示了MyBatis与SpringBoot的集成过程、数据库操作及常见问题的解决方案,适合初学者快速掌握MyBatis核心用法。
2025-11-11 21:31:11
1042
原创 SpringBoot配置文件
本文介绍了配置文件的作用及SpringBoot中的常见配置方式。配置文件用于集中管理可能变更的信息,避免硬编码问题。SpringBoot支持properties和yml/yaml格式,其中properties优先级更高但较冗余,yml凭借树形结构更简洁实用。文章详细展示了两种格式的语法规则,包括基本数据类型、对象和集合的配置方法,并演示了通过@Value和@ConfigurationProperties注解读取配置内容的操作。特别说明了yml中引号使用的区别,以及处理复杂对象时所需的完整流程。这些知识为开发
2025-10-27 20:44:27
452
原创 Spring IoC
IoC(控制反转)是Spring框架的核心思想,它将对象的创建和管理权交给Spring容器,降低程序耦合度。通过汽车制造案例对比传统方式与IoC解耦方式,展示了依赖关系的反转。Spring作为IoC容器,通过类注解(@Controller等)和方法注解(@Bean)管理对象。依赖注入(DI)有三种方式:属性注入、构造方法注入和Setter注入。当存在多个同类型Bean时,可通过@Primary、@Qualifier或@Resource解决冲突。IoC的优点包括资源集中管理、降低耦合度,使程序更易维护和扩展。
2025-10-20 12:26:47
789
原创 Java优选算法——位运算
本文总结了位运算的常见操作及其应用,包括基础运算(左移、右移、取反、与、或、异或)和实用技巧(判断某位值、修改某位值、提取/删除最右侧1)。通过5道LeetCode题目展示了位运算的实际应用:1)判断字符唯一性(位图法);2)找出缺失数字(异或特性);3)两数之和(模拟加法);4)找出唯一出现一次数字(统计位频次);5)寻找两个缺失数字(分组异或)。这些案例展示了位运算在节省空间、提高效率方面的优势,特别适合处理数字二进制位相关的问题。
2025-10-14 19:38:54
1090
原创 Spring Web MVC入门
本文详细介绍了Spring Web MVC框架的核心概念和应用实践。主要内容包括:1. Spring MVC的定义与MVC模式实现,重点讲解了DispatcherServlet的作用;2. 请求处理流程,涵盖路由映射、参数接收(单个/多个参数、对象、JSON等)和注解使用;3. 响应处理,包括返回静态页面、数据、JSON及状态码设置;4. 综合练习演示了计算器、用户登录和留言板等实际案例的实现。文章通过丰富的代码示例,系统性地展示了Spring MVC在Web开发中的核心功能和应用场景,为开发者提供了实用的
2025-10-04 15:46:25
1086
原创 Java优选算法——前缀和
本文介绍了前缀和算法及其典型应用。首先讲解了一维前缀和模板题,通过预处理前缀和数组将区间和查询优化到O(1)时间复杂度。接着扩展到二维前缀和,演示了如何高效计算子矩阵和。随后列举了多个前缀和变种问题:包括寻找数组中心下标、乘积数组、和为K的子数组、可被K整除的子数组、连续0/1数组等,均通过构建前缀和数组或哈希表优化求解。最后介绍了矩形区域和问题,展示二维前缀和在边界处理上的应用。全文通过Java代码示例,系统性地展示了前缀和算法在不同场景下的灵活运用。
2025-09-19 16:54:57
955
原创 简单学习HTML+CSS+JavaScript
本文介绍了网页开发三大核心技术:HTML、CSS和JavaScript。HTML部分详细讲解了文档结构、常用标签(标题、段落、图片等)和表单元素;CSS部分介绍了选择器类型、样式设置(颜色、边框等)和三种引入方式;JavaScript部分包含变量声明、数据类型、函数和对象操作,并介绍了jQuery库的常用功能。最后通过一个猜数字游戏案例,展示了三者的综合应用。全文内容全面,适合前端开发初学者系统学习网页基础技术。
2025-09-13 19:53:44
930
原创 Java优选算法——二分查找
本文介绍了二分查找算法的应用场景和实现模板,重点讲解了如何利用"二段性"特性在非严格有序数组中使用二分法。文章详细分析了几种典型应用场景:1)基本二分查找;2)查找边界位置;3)搜索插入位置;4)平方根计算;5)山脉数组峰顶查找;6)寻找峰值元素;7)旋转数组最小值查找;8)缺失数字查找。每种场景都给出了解题思路、代码实现和边界条件处理,展示了二分查找在O(logn)时间复杂度下的高效应用。通过合理划分区间和调整中点计算方式,可以解决各种变形问题。
2025-09-11 23:13:01
1289
原创 初识JVM
本文介绍了JVM的核心概念和机制:1. JVM内存区域分为程序计数器(线程私有)、方法区(线程共享)、虚拟机栈(线程私有)和堆(线程共享);2. 类加载采用双亲委派模型,通过父加载器优先的层级机制确保类加载的安全性和唯一性;3. 垃圾回收机制主要采用分代算法,通过可达性分析识别垃圾对象,新生代使用复制算法,老年代使用标记-清除或标记-整理算法。这些机制共同构成了Java程序运行时的内存管理和性能优化基础。
2025-09-01 22:21:20
899
原创 网络层——IP协议
本文介绍了IP协议的核心内容,包括协议头格式、地址管理和路由选择。IP协议头包含版本号、头部长度、服务类型等关键字段。地址管理部分重点阐述了解决IP地址不足的三种方案:动态分配地址、IPv6协议和NAT网络地址转换(主流方案),其中详细说明了NAT的工作机制。此外还介绍了网段划分和特殊IP地址的使用。路由选择部分则解释了路由器如何通过路由表转发数据包,包括匹配路由表和"下一跳"机制。文章系统梳理了IP协议的基本原理和关键技术。
2025-08-26 16:31:26
1179
原创 传输层协议——UDP和TCP
本文对比分析了TCP和UDP两种传输层协议的特点和工作机制。UDP是无连接、不可靠的面向数据报协议,具有简单高效的特点,但存在64KB数据长度限制。TCP通过确认应答、超时重传、连接管理(三次握手/四次挥手)、滑动窗口、流量控制、拥塞控制等核心机制实现了可靠传输,同时采用延迟应答、捎带应答等策略提高效率。文章还讨论了TCP的粘包问题及解决方案,异常情况处理方式,并指出两者各有优劣:TCP适用于可靠传输场景,UDP更适合实时性要求高的应用。最后强调应根据具体需求选择合适协议。
2025-08-19 12:58:35
1281
原创 Java优选算法——滑动窗口
本文总结了滑动窗口算法的应用场景和实现方法。滑动窗口适用于处理连续区间问题,通过双指针移动来维护窗口性质。文章详细解析了8道经典滑动窗口题目: 长度最小子数组(求满足和≥target的最短子数组) 无重复字符最长子串(使用哈希表记录字符出现次数) 最大连续1的个数Ⅲ(允许最多翻转k个0) 将x减到0的最小操作数(转化为找和为sum-x的最长连续子数组) 水果成篮(最多包含两种水果类型) 字母异位词(比较两个哈希表是否相等) 串联所有单词的子串(将单词视为整体处理) 最小覆盖子串(引入count变量统计有效字
2025-08-19 12:53:34
1189
原创 网络协议——HTTPS协议
HTTPS是在HTTP基础上引入加密层的安全协议,通过加密传输防止运营商劫持等中间人攻击。其核心工作流程包含三组密钥:第一组非对称密钥(CA机构颁发)用于验证证书真伪;第二组非对称密钥(服务器生成)用于安全传输对称密钥;第三组对称密钥用于实际数据加密传输。关键创新在于引入数字证书机制:服务器向CA机构申请包含公钥和数字签名的证书,客户端通过验证签名确保公钥未被篡改,从而建立安全连接。整个过程既保证了密钥交换的安全性,又通过对称加密提高了传输效率,有效解决了HTTP明文传输的安全隐患。
2025-08-16 01:43:28
768
原创 Java优选算法——双指针
本文介绍了双指针算法的四种常见类型及其应用场景:1. 就地双指针(原地操作数组)2. 扫描双指针(数组划分)3. 对撞双指针(左右指针)4. 快慢双指针(龟兔赛跑算法)。通过8道LeetCode题目展示了双指针的具体应用,包括移动零、复写零、快乐数判断、盛水容器、三角形计数、两数/三数/四数之和等问题。每种题型都给出了解题思路和Java代码实现,重点讲解了如何利用双指针特性优化算法效率,并处理边界条件和重复元素问题。这些例题展示了双指针在数组、链表等问题中的高效性和实用性。
2025-08-15 01:39:13
1198
原创 网络协议——HTTP协议
HTTP协议是应用层协议,用于传输超文本数据。文章首先介绍了HTTP协议的基本概念和工作流程,包括浏览器与服务器的请求响应交互。详细解析了HTTP请求和响应的格式,包括首行、报头和正文三部分结构。重点阐述了GET/POST方法、URL编码规则、常见请求报头(如Host、Cookie等)以及响应状态码(如200、404等)。最后通过Java Socket示例演示了如何构造HTTP请求,展示了协议底层实现原理。全文系统性地讲解了HTTP协议的核心内容,为理解Web通信机制提供了基础。
2025-08-12 20:14:16
855
原创 网络编程——套接字
本文介绍了Socket套接字的概念、分类及TCP与UDP协议的区别。主要内容包括: Socket套接字分为流套接字(TCP)、数据报套接字(UDP)和原始套接字三类; TCP与UDP协议在连接方式、传输可靠性、数据格式和通信模式上的差异; UDP协议中的关键API类及其使用方法; 基于UDP和TCP协议的回显服务器实现,包括服务器端和客户端的代码实现; 通过继承UdpEchoServer实现英译汉服务器的扩展案例。 文章详细讲解了两种协议的网络编程实现,包括数据报的收发、请求处理流程等核心内容,并提供了完整
2025-08-05 19:47:00
1410
1
原创 初识网络原理
本文系统介绍了计算机网络的基本概念和发展历程。主要内容包括:1.网络发展史,从独立模式到局域网、广域网的演进;2.网络通讯基础,详细解析IP地址和端口号的作用;3.网络协议原理,包括五元组标识和协议分层思想;4.TCP/IP五层模型,分析各层功能及网络设备分层;5.完整呈现网络数据从发送到接收的封装解封装流程。文章采用递进式结构,由基础概念到复杂原理,全面阐述了计算机网络的体系架构和数据传输机制,为理解现代网络通信提供了系统性的知识框架。
2025-07-21 16:19:39
1264
原创 文件操作&IO整合
本文系统介绍了Java中的文件操作与IO流应用。主要内容包括:1.文件基础概念:文件路径、树形目录结构、文件分类(文本/二进制);2.File类操作:构造方法、常用API(创建/删除/遍历文件等);3.IO流体系:字节流(InputStream/OutputStream)和字符流(Reader/Writer)的读写操作,重点演示了文件读写、缓冲区优化及资源释放;4.实践案例:包含文件搜索删除、文件复制、内容检索三个综合练习,涉及递归遍历、Scanner应用、StringBuilder优化等内容。文章通过大量
2025-07-18 00:19:01
1193
原创 Java IO流
本文介绍了Java中的IO流操作,主要分为字节流和字符流。字节流以字节为单位处理二进制文件,核心类包括InputStream和OutputStream,重点讲解了FileInputStream/FileOutputStream的使用方法及文件读取的两种方式(单字节读取和缓冲区读取)。字符流以字符为单位处理文本文件,核心类为Reader和Writer,其使用方式与字节流类似。文章还介绍了try-with-resources语法确保资源释放,以及Scanner类简化字符读取。最后对比了两种流的异同,强调缓冲区提
2025-07-16 23:05:51
919
原创 多线程进阶——线程安全的集合类
本文介绍了多线程环境下使用ArrayList和哈希表的线程安全方案。对于ArrayList,可采用自行加锁、Collections.synchronizedList或CopyOnWriteArrayList,其中CopyOnWriteArrayList通过写时复制实现无锁读取。对于哈希表,Hashtable通过全局锁实现线程安全但性能较差,而ConcurrentHashMap采用分段锁、CAS和渐进式扩容机制,显著提升了并发性能。文章对比了不同方案的实现原理和适用场景,为多线程编程中的集合使用提供了实践指导
2025-07-14 20:16:59
959
原创 多线程进阶——JUC的常见类
本文介绍了Java多线程编程中的几个核心工具类:1. Callable接口与FutureTask配合使用实现带返回值的多线程任务,通过get()方法获取计算结果。2. ReentrantLock提供了比synchronized更灵活的锁机制,支持trylock、公平锁等功能。3. Semaphore信号量用于控制资源访问数量,通过acquire()和release()实现PV操作。4. CountDownLatch用于等待多个子线程完成,通过countDown()和await()实现同步。这些工具类为Jav
2025-07-12 21:58:30
922
原创 多线程进阶——CAS
摘要: CAS(Compare and Swap)是一种无锁并发机制,通过比较内存值与预期值实现原子操作。其核心是一条CPU指令,具备高效、线程安全特性,广泛应用于原子类(如AtomicInteger)和自旋锁的实现。但CAS存在ABA问题:若共享变量被其他线程修改后恢复原值,可能导致逻辑错误。解决方案是引入版本号机制,每次修改递增版本号,确保操作时版本一致,避免ABA风险。例如银行扣款场景中,版本号可有效防止余额反复变动引发的并发问题。CAS在保证性能的同时,需结合版本控制提升数据一致性。
2025-07-07 20:43:49
1000
原创 多线程进阶——锁策略、synchronized特性、锁消除、粗化
本文系统介绍了多种锁策略及其实现原理。主要内容包括:1.常见锁策略对比,如乐观锁/悲观锁、重量级锁/轻量级锁、自旋锁/挂起等待锁、读写锁、可重入锁、公平锁等,分析各自特点及适用场景;2.synchronized的具体实现机制,包括其自适应升级过程(偏向锁→轻量级锁→重量级锁);3.编译器优化技术中的锁消除和锁粗化原理。全文通过生活化案例和代码示例,深入浅出地阐述了不同锁策略的工作原理及其对系统性能的影响,为理解并发编程中的锁机制提供了系统性的参考。
2025-07-06 15:03:15
1076
原创 多线程案例——线程池、定时器
本文介绍了线程池和定时器的原理与实现。线程池通过复用线程减少创建/销毁开销,Java标准库提供ThreadPoolExecutor类,包含核心线程数、最大线程数、任务队列等参数配置,并可通过Executors工厂类快速创建。文中还演示了如何实现固定线程数的简易线程池。定时器部分讲解了标准库Timer类的使用,并实现了一个基于优先级队列的自定义定时器,支持延迟任务调度。两者均采用生产者-消费者模型,通过阻塞队列进行任务管理,有效提高系统性能和稳定性。
2025-06-28 11:16:58
828
原创 多线程案例——单例模式、阻塞队列
单例模式是校招中最常考的之一.单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例单例模式最常见的实现方法分为“饿汉”和“懒汉”模式饿汉模式和懒汉模式是单例设计模式的两种不同实现方式,主要区别在于实例化的时机和线程安全性。
2025-06-20 14:17:34
808
原创 多线程之——wait和notify
本文主要介绍了Java多线程中的线程饥饿问题以及wait/notify机制。线程饥饿是由于synchronized默认采用非公平锁,可能导致某些线程长时间无法获取锁。文章详细讲解了wait()、notify()和notifyAll()方法的使用规则:必须搭配synchronized使用,且操作对象必须一致;wait()要在循环中调用以避免虚假唤醒。通过ABC顺序打印的示例,展示了如何利用这些方法实现线程间的协调控制。最后强调了wait()必须在notify()之前调用才有效,否则无法唤醒等待线程。
2025-06-17 10:56:17
1090
原创 多线程中的风险-线程安全问题
线程安全问题主要源于操作系统对线程的随机调度、多线程共享变量、非原子操作、内存可见性问题和指令重排序。当多个线程并发修改共享变量时,可能导致预期外的结果,如count++操作被拆分为多个CPU指令导致数据不一致。解决方法包括:1)使用synchronized同步代码块保证原子性;2)使用volatile关键字解决内存可见性问题,防止编译器优化和指令重排序;3)调整代码结构避免共享变量。其中volatile能保证变量修改的可见性,synchronized则能确保操作的原子性和有序性。合理运用这些机制能有效解决
2025-06-16 22:54:24
930
原创 线程安全问题——加锁
本文介绍了Java中synchronized关键字的加锁机制及其特性。主要内容包括:1.两种加锁方式:lock()/unlock()和synchronized关键字;2.synchronized的变种写法,可修饰方法;3.特性:互斥和可重入性;4.三种死锁场景:单线程重复加锁、双线程互相等待、N线程M把锁(哲学家问题);5.死锁的四个必要条件及避免方法,重点在于打破"请求和等待"或"循环等待"条件。文章强调synchronized能自动释放锁,避免忘记解锁的问题,并通
2025-06-15 14:46:35
1626
原创 多线程的实现及Thread成员方法
Java多线程编程摘要:本文介绍了Java中创建多线程的5种方法(继承Thread类、实现Runnable接口、匿名内部类、lambda表达式等),并详细讲解了Thread类的核心属性和方法。重点包括:线程启动(start)、中断(interrupt)机制及其处理sleep异常时的注意事项、线程等待(join)方法的使用场景。同时对比了前台线程和后台线程的区别,解释了通过Runnable实现任务与线程解耦的设计优势。文章通过具体代码示例展示了线程中断处理的三种方式,以及join方法控制线程执行顺序的实现原理
2025-06-14 21:14:04
1309
原创 多线程的基本概念和特点
本文介绍了线程的基本概念及其特点。线程是轻量级进程,相比进程创建销毁开销更小。线程与进程的主要区别在于:进程包含线程,是资源分配单位,而线程是CPU调度单位;线程共享进程资源,过多线程会导致调度开销增加和资源争夺问题。最后通过Java代码示例展示了如何使用Thread类实现多线程编程,包括线程创建、启动和并发执行的特点。文章强调线程数目并非越多越好,需平衡效率与性能开销。
2025-06-14 00:05:13
756
原创 Java EE——什么是进程?
本文摘要:操作系统是多任务系统的核心,通过进程管理实现并发执行。进程是运行中的程序实例,由进程控制块(PCB)管理,包含pid、内存指针等关键属性。操作系统通过创建/销毁PCB和进程链表实现进程管理。进程调度采用分时复用技术,通过状态、优先级、上下文切换等机制实现并发执行。记账信息则用于平衡CPU资源分配,确保系统高效运行。
2025-06-13 14:34:38
798
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅