- 博客(33)
- 收藏
- 关注
原创 【Java】MQTT(Java 实现 MQTT 通信)
MQTT是一种轻量级物联网通信协议,由发布者、服务器和订阅者组成。发布者发送消息到服务器,服务器根据主题将消息转发给匹配的订阅者。文章介绍了Java客户端连接EMQX的实现方法:1)添加MQTT和JSON依赖;2)发送者示例,通过指定主题和内容上报电量;3)订阅者示例,通过回调接收处理电量信息。最后指出可封装EMQX客户端简化代码,并提及MQ消息中间件可解决设备通信、高并发等问题。
2025-09-24 16:07:50
565
原创 【Java】Redis(中间件)
Redis是基于内存的数据库,支持多种数据类型(String、List、Hash、Set、Sorted Set)和持久化机制(RDB快照和AOF日志)。它采用内存淘汰策略(LRU/LFU)和过期删除策略(定时/惰性/定期删除)管理内存。企业级解决方案包括处理缓存击穿(永不过期/加锁排队)、雪崩(TTL随机值/集群部署)和穿透(缓存空对象/布隆过滤)。主从复制通过连接建立、数据同步和命令传播实现读写分离和数据备份,哨兵系统则负责监控和自动故障转移。
2025-09-01 21:22:05
1358
原创 【Java】springboot的自动配置
SpringBoot自动装配机制解析:通过@EnableAutoConfiguration注解触发,核心流程包括加载META-INF/spring.factories中的配置类,并通过条件注解(如@ConditionalOnClass)筛选生效的组件。该机制基于约定实现开箱即用的功能,支持自定义配置覆盖默认行为,极大简化了Spring应用开发。本文详细剖析了自动装配的三步流程,并演示了如何自定义starter,包括定义配置类、条件注解使用和spring.factories配置。
2025-08-24 22:02:51
972
原创 【Java】SpringBoot常用注解(持续更新)
本文总结了SpringBoot开发中的核心注解,主要包括:1)应用启动类注解@SpringBootApplication;2)组件注册注解(@Component、@Controller、@Service等);3)依赖注入注解(@Autowired、@Resource);4)请求映射与参数绑定注解(@GetMapping、@PathVariable等);5)配置属性绑定注解(@Value、@ConfigurationProperties)。这些注解简化了配置管理、组件注册和Web开发流程,涵盖了SpringB
2025-08-24 19:08:49
275
原创 【Java】Spring(Bean的生命周期)
本文详细解析了Spring Bean的生命周期管理,包括创建、初始化、使用和销毁四大阶段。重点介绍了实例化、依赖注入、Aware接口回调、BeanPostProcessor处理、初始化方法(@PostConstruct、InitializingBean、XML配置)以及销毁阶段(@PreDestroy、DisposableBean、XML配置)等核心流程。通过代码示例展示了各阶段的具体实现方式,并针对常见问题提供了解决方案。Spring通过丰富的扩展点(注解、接口、BeanPostProcessor)实现了
2025-08-18 08:56:24
949
原创 【Java】MyBatis(创建过程、配置文件)
MyBatis是一款半自动化的持久层框架,它通过SQL与代码分离的设计理念,在JDBC繁琐操作与Hibernate全自动化ORM之间取得了平衡。其核心组件包括SqlSessionFactory、SqlSession、Mapper接口和XML映射文件,实现了SQL灵活性与自动映射的结合。创建MyBatis项目需配置核心文件、定义实体类和Mapper接口、编写XML映射,并通过SqlSession执行操作。MyBatis特别适合需要精细控制SQL的场景,既保留了SQL的灵活性,又简化了参数处理和结果集映射,是J
2025-08-11 09:32:50
584
原创 【Java】JVM虚拟机(java内存模型、GC垃圾回收)
本文系统介绍了Java内存模型(JMM)及垃圾回收机制。JMM规范多线程对共享内存的访问,确保并发一致性。Java运行时数据区分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、元空间)区域。堆内存分为新生代和老年代,采用不同的垃圾回收策略。文章详细分析了判断对象存活的引用计数和可达性分析算法,以及四种引用类型(强、软、弱、虚引用)的特点。重点阐述了三种垃圾回收算法(复制、标记-清除、标记-整理)的优缺点及适用场景,并对比了Serial、Parallel、CMS、G1等主要垃圾收集器的实现原理和
2025-07-29 00:42:26
783
原创 【Java】JVM虚拟机(基本概念、类加载机制)
摘要:JVM是Java程序运行的核心组件,实现"一次编写,多处运行"的跨平台特性,包含类加载子系统、运行时数据区等模块。类加载机制分为加载、验证、准备、解析、初始化五个阶段,通过双亲委派模型由启动类、扩展类、应用类加载器分层加载。主动引用(new、静态方法/变量、反射、子类初始化)会触发类初始化,而被动引用(数组创建、子类引用父类静态变量)不会。自定义类加载器可扩展特殊加载需求。
2025-07-25 17:38:14
1081
原创 【Java】Reflection反射(代理模式)
代理模式通过引入代理对象控制对真实对象的访问,分为静态代理和动态代理。静态代理在编译时确定代理类,每个目标类需对应一个代理类;动态代理在运行时生成,灵活性更高,包括JDK代理(基于接口)和CGLIB代理(基于继承,无需接口)。JDK代理通过InvocationHandler实现方法拦截,CGLIB通过MethodInterceptor实现。代理模式增强了系统扩展性,静态代理适用于简单场景,动态代理适合复杂需求。
2025-07-23 18:50:18
514
原创 【Java】Reflection反射(相关操作)
反射的目的是为了获取某个实例的信息。当我们拿到莫个Object实例时,可以通过反射获取该Object的Class信息。类是反射机制的一部分,用于表示类的构造函数,它提供了获取构造函数信息以及使用反射创建对象的能力。使用invoke调用静态方法时,第一个参数无需传入实例对象,写入null即可。类是核心组件之一,用于访问和操作类的成员变量(包括字段的属性、值以及修改访问权限等)类,我们可以获取方法的签名、调用方法,甚至调用私有方法。也可以通过反射的方式来创建。在 Java 反射机制中,
2025-07-23 01:14:27
418
原创 【Java】JUC并发(CAS、ThreadLocal)
本文介绍了Java并发编程中的两个关键技术:CAS和ThreadLocal。CAS是一种无锁同步机制,通过比较并交换实现原子操作,适用于AtomicInteger、ConcurrentHashMap等场景,但存在ABA问题、循环开销大等缺点。ThreadLocal则通过线程局部变量实现数据隔离,每个线程拥有独立变量副本,使用ThreadLocalMap结构存储,需注意内存泄漏问题。文章详细分析了两种技术的实现原理、应用场景、优缺点及使用方法,包括CAS的执行流程、ThreadLocal的常用方法(set/g
2025-07-21 19:28:17
1125
原创 【Java】JUC(线程池---深入了解、状态、源码解析)
本文详细介绍了线程池的参数配置及实现原理。线程池实际包含7个参数:核心/最大线程数、存活时间、时间单位、工作队列、线程工厂和拒绝策略。重点分析了四种常用线程池:FixedThreadPool(固定线程数)、CachedThreadPool(动态线程数)、SingleThreadExecutor(单线程)和ScheduledThreadPool(定时任务)。文章深入解析了Worker类的实现机制,包括runWorker()和getTask()等核心方法的工作原理,展示了线程池如何通过锁机制和任务队列实现线程复
2025-07-20 01:37:41
895
原创 【Java】JUC并发(JUC并发集合、线程池)
本文介绍了Java中常见的线程安全集合类和线程池的实现原理。线程安全集合类包括:CopyOnWriteArrayList(写时复制机制)、ConcurrentHashMap(CAS+synchronized)、BlockingQueue及其实现类ArrayBlockingQueue(数组实现)和LinkedBlockingQueue(链表实现,读写分离)。线程池部分详细说明了创建方式、执行流程(核心线程-工作队列-最大线程)和四种拒绝策略:AbortPolicy(抛异常)、CallerRunsPolicy(
2025-07-18 00:02:56
943
原创 【Java】JUC并发(synchronized进阶、ReentrantLock可重入锁)
本文介绍了Java中两种锁机制:Synchronized的锁升级机制和ReentrantLock特性。Synchronized在Java6后引入锁升级机制(无锁→偏向锁→轻量级锁→重量级锁),通过对象头和Monitor实现,可根据线程竞争情况动态调整锁状态。ReentrantLock作为显式锁,支持可重入、中断、超时机制、公平性选择及条件变量,相比Synchronized提供更灵活的锁控制。文章还展示了线程安全单例模式实现和两种锁的典型使用案例,分析了它们在锁管理、中断性、超时机制等方面的差异。
2025-07-16 19:28:49
1203
原创 【Java】JUC并发(线程的方法、多线程的同步并发)
Synchronized关键字,也可以理解为一种同步锁。他可以对一段代码进行加锁和解锁,从而使其拥有原子性,从而确保代码的线程安全。
2025-07-15 23:12:40
1062
原创 【Java】JUC并发(线程基础、线程的状态)
本文介绍了Java线程的基础知识和应用方法。主要内容包括:1)线程基本概念,区分了程序、进程和线程,比较了进程与线程的区别,解释了并发与并行;2)单线程与多线程的实现方式;3)线程的创建与启动方法;4)三种线程实现方式:继承Thread类、实现Runnable接口、实现Callable接口;5)线程池的使用;6)线程命名和休眠操作;7)线程的六种状态。通过代码示例演示了各种线程操作的具体实现,为Java多线程编程提供了基础指导。
2025-07-15 00:09:31
647
原创 《ArrayList核心代码阅读》
i</tt> 对应的元素(如果存在这样的元素)。get(i)==null : o.equals(get(i)))</tt> 的最小索引 <tt>i</tt>,get(i)==null : o.equals(get(i)))</tt> 的最大索引 <tt>i</tt>,// 如果列表中包含指定元素(即列表因调用此方法而发生了变化),则返回 <tt>true
2025-03-25 15:27:58
214
原创 《Integer缓存池》
128 ~ 127:相同数值的 Integer 对象通过==比较返回true(内存地址相同,共享一个缓存对象)。超出范围:相同数值的 Integer 对象通过==比较返回false(内存地址不同,说明每个数值都创建了新的对象)。缓存命中当数值i在(或自定义范围)内时,直接返回缓存数组中的对象。避免重复创建对象,实现内存复用。缓存未命中超出范围时,创建新的Integer对象。
2025-03-25 02:06:33
326
原创 StringBuilder和StringBuffer的区别、扩容机制
扩容机制首先尝试将原容量扩大为2倍+2,如果这个新容量仍然不够,就会使用需要的最小容量作为最小容量。如果新容量足够,则使用新容量作为当前数组容量。
2025-01-29 13:21:51
473
原创 String类的equals()的作用和源代码解读
1、只有引用数据类型才能使用equals()方法,基本数据类型不能使用equals()方法。2、引用数据类型没有重写equals()方法时,会默认自动调用父类Object类中equals()方法,父类中 该方法依然采用" == "运算来进行内存地址的比较。所以引用类型一般都需要重写equals()方 法,来实现内容的比较。
2025-01-20 18:30:44
278
原创 String为什么是不可变的?
不可变的原因:1、String内部使用一个数组来作为数据结构,保存字符串中所有字符,且该数组是通过final关键字来进行修饰,所有该数组一旦创建,就不能重新分配内存地址空间。2、每个修改字符串的方法,都会将新的修改内容保存到一个新的字符串对象中,并不会修改原有字符串内容。
2025-01-20 00:47:33
278
原创 Java 抽象类与接口:差异、应用场景
在Java编程中,抽象类和接口是两个重要的概念,它们在实现多态性和代码复用方面发挥着关键作用。对于初学者来说经常将他们两个混淆。
2025-01-20 00:04:47
492
原创 深入理解位运算
位运算作为计算机底层的重要操作,为我们提供了一种直接操作二进制数据的高效方式。虽然位运算在日常应用开发中可能不常见,但在系统编程、算法优化、数据处理等领域,它是不可或缺的强大工具。
2025-01-12 23:01:14
362
原创 冒泡排序算法
冒泡排序作为一种基础的排序算法,虽然在效率上不如一些高级排序算法,但它简单的原理和实现方式为我们理解排序算法的本质提供了很好的切入点。通过对冒泡排序的学习,我们可以进一步探索其他更高效的排序算法,如快速排序、归并排序等。
2025-01-12 19:22:21
323
原创 IDEA 配置 Maven 本地仓库:提升项目构建效率与管理便利性
Maven 本地仓库是本地文件系统缓存,存放项目依赖的 jar 包、插件及项目自身构件。其结构遵循特定目录布局,便于 Maven 精准定位管理。当项目构建时,Maven 先从本地仓库检索所需依赖,若无则从远程仓库下载并缓存,此机制加快构建、节省网络资源、确保依赖一致性,为项目稳定与团队协作筑牢根基。
2024-12-10 02:10:48
2209
1
原创 Maven下载与安装
Maven 基于项目对象模型(POM)概念,能自动化处理项目构建、依赖管理、文档生成等繁琐任务。其核心优势在于统一项目结构与构建流程,精准管理项目依赖库,有效解决库冲突与版本兼容难题,大幅减轻开发者维护负担,确保项目稳定可靠。
2024-12-10 01:30:07
678
原创 jsp页面输出中文乱码问题和idea控制台乱码问题
我们在开发项目过程出现表单提交后jsp页面输出提交内容乱码问题,以及idea乱码问题。上述是我解决中文乱码问题的方法,其他方法大家可以补充。在 JSP 文件中设置响应的编码方式,可以在。1、在设置中打开:(选择文件编码)
2024-11-04 22:24:28
1040
原创 PyCharm专业版安装
到这里PyCharm就已经成功安装啦,但专业版需要激活还能有完整体验。2、找到自己需要的版本进行安装(Progrddionsl为专业版)7.安装成功后先选否,然后完成。3、找到下载安装包双击进行安装。6、选择自己需要的进行勾选。5、选择自己安装路径。
2024-10-19 20:46:32
789
原创 C++对汉诺塔问题的实现
汉诺塔(Tower of Hanoi)是经典的递归问题。假设有三根柱子 A、B、C,其中 A柱上有 n 个大小不一的圆盘,从大到小依次叠在一起。目标是将这些圆盘从 A 柱借助 B 柱移动到 C 柱。1、将前 n -1 个圆盘从 A 柱移到 B 柱(借助C)。递归结束条件:当只有一个盘子时,直接移动到目标柱即可。3、将 n-1 个圆盘又从 B 柱移动道 C 柱。2、将第n个圆盘从 A 柱移到 C 柱。2、大圆盘不能放在小圆盘上。1、每次只能移动一个圆盘。
2024-10-17 20:24:22
535
原创 PyCharm操作MongoDB数据库准备
在终端中输入pip show pymongo命令如果返回pymongo版本等信息则证明成功安装。MongoClient('mongodb://用户名:密码@服务器ip或者域名:27017/')如果没有安装进行安装:在终端中输入pip install pymongo进行安装。当完成上述步骤准备工作已经完成可以进行数据库的操作啦。emps=db.数据库中需要的表名。db=client.数据库名。注:27017为本地域名。
2024-10-15 00:18:09
704
原创 有趣的一些C语言问题
1-6的自然数分别赋值给A,B,C,D,E,F使字母组成一个三角。要求:1.每条边由三个字母组成2.字母所对应的数值不相等3.输出数字形成三角形
2022-10-20 18:17:18
245
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅