- 博客(142)
- 收藏
- 关注
原创 JavaEE Spring框架的概述与对比无框架下的优势
Spring框架是一个开源的轻量级企业级应用开发框架,通过IoC容器实现依赖注入管理对象生命周期,支持AOP实现横切关注点分离,提供声明式事务管理和MVC架构简化Web开发。其核心特性包括:依赖注入降低耦合度、面向切面编程分离日志/事务等公共逻辑、声明式事务简化数据库操作、MVC架构统一处理Web请求。相比传统开发方式,Spring通过注解和容器管理大幅减少重复代码,使开发者能专注于业务逻辑而非基础设施,显著提升开发效率和系统可维护性。框架还提供对JDBC、ORM、缓存等技术的无缝集成支持。
2025-07-23 15:08:32
697
原创 消息队列 2.RabbitMQ的基本概念与使用
RabbitMQ是基于AMQP协议的开源消息中间件,支持分布式系统的异步通信、系统解耦和流量削峰。其核心组件包括生产者、消费者、交换机、队列和绑定规则,通过RoutingKey实现消息路由。Java通过RabbitMQ客户端API实现消息发送和接收,Spring AMQP则进一步简化了集成过程。RabbitMQ支持多种交换机类型(Direct、Topic、Fanout)以满足不同场景需求,广泛用于异步通信、系统解耦和流量削峰等场景,是构建可扩展分布式系统的理想选择。
2025-07-18 18:12:04
1384
原创 消息队列 1.消息队列基本概念
消息队列是一种实现异步通信的中间件技术,采用生产者-消费者模型。核心组件包括生产者、消费者、消息队列和消息本身。主要模型有点对点(单消费者)和发布-订阅(多消费者)。优势体现在系统解耦、流量削峰和异步处理三大场景。主流产品各有特点:RabbitMQ功能全面但吞吐一般,Kafka适合大数据高吞吐,RocketMQ平衡性能与功能,ActiveMQ面向传统企业。选型需结合吞吐量、可靠性、功能需求和业务场景等维度综合考量,如大数据选Kafka,金融电商可选RocketMQ或RabbitMQ。
2025-07-18 09:09:22
944
原创 JAVA 并发 ThreadLocal
是 Java 中实现线程隔离的重要工具,合理使用它可以简化多线程编程,但同时也需要注意其潜在的内存泄漏风险和适用场景。
2025-07-14 22:06:29
666
原创 JAVA 设计模式 代理
代理设计模式通过代理对象控制对目标对象的访问,提供额外功能而不修改原代码。它包括静态代理(编译时确定)和动态代理(运行时创建)。静态代理需手动编写代理类,动态代理利用Java反射机制动态生成。代理模式适用于AOP、远程调用、延迟加载等场景,核心优势是非侵入性和灵活性。动态代理通过Proxy类和InvocationHandler接口实现方法拦截和增强,是AOP和RPC等技术的基础。
2025-07-14 08:19:24
251
原创 JAVA 设计模式 适配器
适配器设计模式是一种结构型模式,用于解决接口不兼容问题。其主要包含三个角色:目标接口、需要适配的类以及适配器。实现方式分为类适配器(通过继承)和对象适配器(通过组合)。类适配器在Java中需继承一个类并实现目标接口,对象适配器则通过持有适配者实例实现转换。该模式适用于复用现有类、整合不相关类等场景。其优点包括提高复用性、灵活扩展,但过度使用可能导致系统混乱。由于Java单继承限制,类适配器只能适配一个类且目标必须是抽象类。
2025-07-14 08:16:56
269
原创 JAVA 设计模式 工厂
工厂设计模式是一种创建型设计模式,通过专门工厂类创建对象,实现创建与使用的分离。该模式包含产品接口(定义通用方法)、具体产品类(实现接口)和工厂类(负责实例化)。示例展示了Shape接口及其圆形、矩形等具体实现,通过ShapeFactory按需创建不同形状对象。优点包括降低耦合度、提高扩展性、符合开闭原则,适用于复杂对象创建或需要动态生成不同类型对象的场景。工厂模式将对象创建逻辑集中管理,使系统更易维护和扩展。
2025-07-14 08:15:33
285
原创 JAVA 设计模式 单例
单例模式是一种确保类只有一个实例的设计模式,提供全局访问点。适用于配置管理、数据库连接等场景。核心包括私有构造函数、静态实例和访问方法。实现方式主要有:饿汉式(简单但可能浪费资源)、懒汉式(延迟加载但性能较差)、静态内部类(延迟加载且线程安全)、枚举(最安全但灵活性差)。注意事项包括线程安全、序列化和反射问题。选择实现方式需权衡资源利用、性能和复杂度。
2025-07-14 08:13:34
341
原创 JAVA JVM虚拟线程
Java虚拟线程是Java 19引入并在Java 21正式标准化的轻量级线程实现,旨在提升高并发应用的性能和资源利用率。相比传统平台线程(直接映射OS线程),虚拟线程具有显著优势:轻量级(KB级内存)、高效资源利用(JVM调度)和同步编程简化。其核心原理是通过Continuation机制实现用户态协程,由ForkJoinPool调度器管理载体线程复用。虚拟线程特别适合IO密集型场景(如Web服务器),可支持百万级并发,但对CPU密集型任务效果有限。该技术通过降低上下文切换开销和栈内存优化,实现了用同步代码编
2025-07-13 17:22:00
694
原创 JAVA JVM垃圾收集
即使在可达性分析算法中判定为不可达的对象,也不是“非死不可”的,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。设计者一般至少会把Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域,在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。
2025-07-11 17:40:06
923
原创 JAVA JVM对象的实现
JVM对象内存分配与访问机制: JVM对象内存分配主要分为类加载检查、内存分配、初始化和对象头设置等步骤。分配方式包括指针碰撞(适用于规整内存)和空闲列表(适用于不规整内存)。为确保线程安全,JVM采用CAS或TLAB机制。对象内存布局由对象头(含MarkWord和类型指针)、实例数据和对齐填充组成。对象访问方式包括句柄访问(稳定但性能低)和直接指针访问(性能高但需修改引用)。HotSpot虚拟机默认采用直接指针访问方式以提高性能。
2025-07-10 16:22:55
1028
原创 JAVA JVM的内存区域划分
JVM内存区域分为线程私有和共享两部分。线程私有包括:程序计数器(记录字节码行号,不会OOM)、虚拟机栈(存储方法调用信息,可能栈溢出)和本地方法栈(支持native方法)。线程共享区域有堆(存放对象实例)和方法区(存储类信息等,Java8后改为Metaspace)。堆外内存指直接内存。程序计数器不会OOM因其占用固定极小空间,仅存储行号。栈溢出发生在深度过大时,而堆是JVM最大的内存区域,几乎所有对象实例都在此分配。(149字)
2025-07-10 16:16:28
381
原创 Java HashMap 的 get 和 put 方法的实现流程
HashMap的put方法流程包括:1)计算key的哈希值,通过高低位异或减少冲突;2)检查并初始化table数组;3)定位桶位置;4)处理空桶直接插入;5)非空桶则检查首节点匹配情况;6)树节点调用树操作,链表则遍历查找;7)存在则替换值,否则尾部插入;8)链表超长(8)时转为红黑树;9)最后检查扩容。get方法类似,通过哈希定位后,优先检查首节点,再区分树/链表结构查找。两种方法均使用(n-1)&hash定位桶,确保高效访问。
2025-07-09 18:36:37
331
原创 JAVAEE Stream流
Java Stream流是一种以声明式处理集合数据的工具,具有不存储数据、函数式编程和延迟执行等特点。创建方式包括从集合、数组创建,或使用Stream.of()、无限流等。Stream操作分为中间操作(filter、map等)和终端操作(collect、forEach等),中间操作返回新流,终端操作触发执行并产生结果。典型应用如将List转为Map时,通过Collectors.toMap处理键冲突,保留先出现的元素。Stream使代码更简洁易读,适合数据批量处理场景。
2025-07-09 11:31:38
465
原创 JAVAEE 代理
摘要:Java代理模式分为静态代理和动态代理两种主要形式。静态代理需手动编写代理类,在编译时确定;动态代理(包括JDK动态代理和CGLIB动态代理)则通过反射在运行时生成。JDK动态代理基于接口实现,使用Proxy类和InvocationHandler接口;CGLIB动态代理通过继承目标类生成子类代理,适用于无接口的类。三种方式各有特点:静态代理性能高但维护成本高,JDK动态代理灵活但有接口限制,CGLIB动态代理功能强大但需第三方库支持。代理模式常用于日志记录、事务管理等场景,实现方法拦截和功能扩展。
2025-07-08 20:51:25
501
原创 算法 堆与堆排序
堆是一种完全二叉树,分为大顶堆和小顶堆两种类型。堆具有结构性和有序性两大特性,可通过数组存储。堆的基本操作包括插入元素(上浮调整)和删除堆顶元素(下沉调整),时间复杂度均为O(logN)。堆排序通过构建初始堆、交换堆顶与末尾元素、调整堆结构三个步骤实现排序,优化后的构建方法时间复杂度为O(N)。相较于逐个插入的O(NlogN)方法,自底向上的堆调整更高效,因其充分利用堆结构特性,减少下沉操作次数。
2025-07-07 12:21:27
1019
原创 sql USING 简化 JOIN 操作
SQL中的USING子句是JOIN操作的简化语法,用于指定连接表的列名。相比ON子句,USING更简洁,并自动去除重复的连接列,在结果集中只显示一次。它支持多列连接(用逗号分隔),且与GROUP BY、ORDER BY配合使用时无需表名前缀。但需注意:连接列必须在两个表中存在且数据类型兼容,避免在子查询中对连接列使用别名。主要优势在于语法简化和自动去重,提高了查询可读性。
2025-07-03 12:14:42
452
1
原创 SpringBoot 常见问题 spring-boot-starter、spring-boot-starter-test、spring-boot-starter-web含义与作用
Spring Boot Starter是简化项目依赖管理的核心组件,通过模块化设计提供开箱即用的功能。主要作用包括:1)通过单一依赖替代多个分散依赖;2)自动管理版本兼容性;3)触发相关自动配置。常用Starter有:spring-boot-starter-web(整合Spring MVC+Tomcat)、spring-boot-starter-test(集成JUnit/Mockito等测试工具)、spring-boot-starter(基础核心功能)。各Starter形成层级依赖关系,如web start
2025-06-30 11:07:26
699
原创 算法 Arrays.sort()函数自定义排序(Comparator 接口)
/ 比较两个对象,返回值决定顺序// 默认方法(Java 8+新增)// 更多默认方法用于组合比较器compare 方法返回值负数:表示o1应排在o2前面0:表示o1和o2相等正数:表示o1应排在o2后面。
2025-05-28 11:56:06
428
原创 JavaEE MyBatis-Plus MyBatis-Plus介绍
提供了通用的Mapper和Service,可以在不编写任何SQL语句的前提下,快速的实现单表的增删改查(CURD),批量,逻辑删除,分页等操作。物理分页,开发者无需关心具体操作,配置好插件之后,写分页等。语句以及其执行时间,建议开发测试时启用该功能,能快速揪出。层代码,支持模板引擎,更有超多自定义配置等您来使用。操作,更有强大的条件构造器,满足各类使用需求。操作智能分析阻断,也可自定义拦截规则,预防。表达式,方便的编写各类查询条件,无需再。,性能基本无损耗,直接面向对象操作。配置,完美解决主键问题。
2025-03-25 16:06:45
354
原创 常见问题 java中Integer的128陷阱
在 Java 里,Integer存在一个 “128 陷阱”,这与 Java 对Integer对象的缓存机制有关。
2025-03-18 15:15:18
268
原创 常见问题 String类型和string builder类型以及string buffer。有什么共同点与区别?
2.Sting builder.和string buffer速度远远高于字符串。
2025-03-18 14:23:08
147
原创 算法 异或概要与利用异或实现交换
eor=a^b 意味着某一位上ab一定不一样(那一位=1)1)一种数出现奇数次 其他各个数出现偶数次 找奇数次的数。上方代码实现了数组元素的交换,如何使用异或简化代码?2)两种数出现奇数次 其他出现偶数次 找奇数次的数。其他数运算(可以理解为无进位相加)eor'只去异或第八位为1的数。找到那一位(假设为8)2.满足交换,结合律。
2025-03-15 00:58:32
127
原创 算法 取出某整数二进制形式里最右边的 1
这段代码的主要功能是找出整数 eor 二进制表示中最右侧的 1 所对应的数,也就是提取出 eor 二进制形式里最右边的 1,其余位都置为 0。由于 ~eor + 1 是 eor 的补码,在 eor 中最右边的 1 所在的位置,eor 和它的补码该位都为 1,而其他位置上 eor 和它的补码必然是一个为 0 另一个为 1。这里 ~eor + 1 得到的结果和 -eor 是一样的(在计算机中负数以补码形式存储)。它会将 eor 的二进制表示中的每一位进行取反操作,即 0 变为 1,1 变为 0。
2025-03-13 14:21:01
228
原创 JavaEE SpringBoot 3、简化部署
2.右侧maven打开,点击install打包成jar包,jar包在target中。java -jar jar包名称(可以使用tab键补齐)1.pom.xml文件中下载插件。3.打开jar包所在的文件夹。
2025-03-12 11:25:51
178
原创 JavaEE SpringBoot 2、Spring Boot 入门
简化Spring应用开发的一个框架;整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;优点:快速创建独立运行的spring项目以及与主流框架集成使用嵌入式的Servlet容器,应用无需打成war包,内嵌TomcatStarters自动依赖和版本控制大量的自动装配,简化开发,也可以修改默认值无需配置XML无代码生成开箱即用准生产环境的运行时应用监控与云计算的天然集成。
2025-03-10 19:07:26
323
原创 JavaEE SpringBoot 1、SpringBoot项目的创建
完成后按照需求修改java版本与spring-boot-starter-parent版本,并重新加载项目即可。完成后按照需求修改java版本与spring-boot-starter-parent版本,并重新加载项目即可。3. Idea从阿里云的官网(https://start.aliyun.com)下载打开。Java与jdk版本不同可以在项目中的pom.xml里修改。可以勾选依赖项,也可以在项目中的pom.xml中导入依赖项。可以勾选依赖项,也可以在项目中的pom.xml中导入依赖项。
2025-03-09 19:48:03
729
原创 常见问题 Mybatis获取参数值的两种方式 #{} ${}的区别
mybatis的#{}之所以能够预防sql注入是因为底层使用了PrepardStatment类的setString()方法来设置参数, 此方法会获取参数传递过来的每个字符,然后进行循环对比,如果发现有敏感字符(如:单引号、双引号等), 则会在上边加一个‘/’代表转义此符号,让其变成一个普通的字符串,不参与SQL语句的生成,达到预防sql注入的效果。1.能用 #{} 的地方就用 #{},尽量少用 ${}${}的本质是字符串拼接,#{}的本质是占位符赋值。如何选择使用 #{} 和 ${}比如我们要做如下查询。
2025-03-08 17:29:01
310
原创 常见问题 springmvc 拦截器、过滤器的概念与区别
程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值true,则程序继续向下执行处理器当中的方法,否则不在向下执行;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。所以,此方法可对方法进行判断,决定程序是否继续执行,或者进行一些初始化操作及对请求进行预处理。由于是在Controller方法执行完毕之后执行该方法,所以该方法适合进行。,可通过此方法多被用于处理返回的视图,可通过此方法对请求域中的模型和视图做进一步的修改。
2025-03-08 16:04:46
441
原创 常见问题 springmvc流程
从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。DispatcherServlet将请求分发给 Controller之前,需要借助于Spring MVC提供的HandlerMapping定位到具体的Controller。处理器映射器(Handler Mapping)是一个组件,负责将请求映射到相应的处理器(Controller),会自动将请求URL与这些注解进行匹配,找到对应的处理器。
2025-03-08 15:52:15
288
原创 常见问题 开发服务器端架构程序B/S,C/S的概念与区别
B/S结构:Browser/Server(浏览器/服务器)结构。在这结构下,用户界面通过浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,建立在广域网的基础上。网页浏览器作为客户端,用户通过浏览器访问Web应用程序或网站,而服务器则承载着数据的存储及处理功能,用户无需在本地安装额外的软件。C/S结构:Client/Server(客户机/服务器)结构,通过向服务器发起请求来获取资源或服务。服务器则是提供服务的计算机系统,客户端需要用户在本地安装专用的客户端软件,以便与服务器进行通信。
2025-03-08 15:27:07
161
原创 常见问题 Spring的核心控制反转(IOC)和面向切面(AOP)
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。在当前情况之下A类想要调用B类就必须自己在自己的内部新建B类的对象,这样的耦合度太高,那我们如何降低耦合度的呢?如上图所示这是一个基本的登录原理图,但是如果我们想要在这个登录之上添加一些新的功能,比如权限校验。③ 采用反射设计模式创建对象。
2025-03-08 10:24:29
341
原创 JavaSE 多态 1.多态概念与抽象类(普通类)继承多态
父类的引用指向子类的实例,调用覆写的这个方法的时候,调用是子类的方法。继承多态,不仅仅是父类是抽象类,父类是普通类也是可以的。多态就是行为具有表现多种功能的能力。判断父类的实际的真身是哪个子类的实例。领导考核讲师的使用多态来完成。子类对父类有方法重写。
2025-03-07 19:38:38
121
原创 常见问题 java中default与public、protected、default、private的差异和default的用法
默认方法修饰符: default,表示这是接口中的一个默认方法,实现该接口的类可以选择不实现这个方法(即使用默认实现)。默认方法使用default关键字修饰,并且必须提供方法体。这允许在不破坏现有实现的情况下,向接口添加新的方法。通俗解释:如果不加修饰符(例如没有写 public、protected、private),则为 default。只有在同一个包内的类可以访问,外部包无法访问。概念:默认访问权限,也称包级私有,只有同一个包中的类可以访问,其他包中的类不能访问。default(包级私有,未加修饰符)
2025-03-07 18:49:02
291
原创 JavaSE 接口 3.接口在JDK1.8中的特性
4.接口中的“属性”是public static final类型的,抽象类中的属性跟普通类中的属性没有区别。5.接口中的方法默认就是抽象的不需要加absract,抽象类中的抽象方法需要加abstract关键字。2.接口和抽象类都不能实例化,接口需要类来实现后实例化实现类,抽象类需要类来继承然后实例化子类。这允许在不破坏现有实现的情况下,向接口添加新的方法。3.抽象类只能单继承,接口可以多继承接口(jdk1.7),接口还可以多实现。1. 接口定义的是一种标准,可以使我们的代码分层开发,分模块开发。
2025-03-07 17:08:14
158
原创 常见问题 接口和抽象类的区别
4.接口中的“属性”是public static final类型的,抽象类中的属性跟普通类中的属性没有区别。5.接口中的方法默认就是抽象的不需要加absract,抽象类中的抽象方法需要加abstract关键字。2.接口和抽象类都不能实例化,接口需要类来实现后实例化实现类,抽象类需要类来继承然后实例化子类。3.抽象类只能单继承,接口可以多继承接口(jdk1.7),接口还可以多实现。1.接口是行为的抽象可以有。,抽象类中可以有所有方法。
2025-03-07 16:25:41
94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人