MySQL支持哪些事务隔离级别?
在 MySQL 中,事务隔离级别决定了事务之间如何相互影响,主要有四种: 读未提交:事务可以读取其他事务尚未保存的数据,这可能导致“脏读”问题。读已提交:事务只能读取已经保存的数据,避免了脏读,但可能导致查询结果不一致。可重复读:保证在同一个事务中多次查询的结果一致,避免了数据不一致,但可能出现“幻读”。串行化:所有事务一个接一个执行,完全避免并发问题,但会极大降低性能。📚 知识内容👀 1. 读未提交(READ UNCOMMITTED)在该隔离级别下,一个事务可以读取到另一个事务尚未提交的更改。这个级别存在 脏读 的问题。脏读是指一个事务读取了其他事务未提交的数据,而这些数据可能在后续被回滚,导致读取到的数据不可靠。 示例:事务 A 更新了 products 表的某条记录,但尚未提交,事务 B 就读取到了这个未提交的更新。如果事务 A 最终回滚,事务 B 所读取的数据就变得无效。 – 事务 ABEGIN;UPDATE products SET price = 200 WHERE id = 1; – 事务 BBEGIN;SELECT * FROM produ...
Spring控制反转的定义是什么?
Spring IOC 是 Spring 框架的核心,它的作用是让 Spring 容器来负责创建和管理程序中的对象,而不是由程序员自己手动创建和管理这些对象。具体来说,依赖注入 是一种让一个对象的需要(比如它需要其他对象来帮助它完成任务)由外部提供,而不是对象自己去找。这种方式让代码变得更加 灵活,因为我们不需要改变对象的代码就能替换它们,也更容易维护和扩展。 📚 知识内容🤔 什么是 IOC?IOC 是 Inversion of Control(控制反转) 的缩写,本质是将对象创建和依赖注入的控制权,从程序代码手动管理转移到 Spring 容器。它的核心目标是:让代码解耦,模块职责更清晰,维护更容易。 🐘 它是怎么工作的?IOC 的实现依赖 DI(Dependency Injection,依赖注入),主要有三种方式: 构造器注入: 通过构造方法传递依赖对象。Setter 方法注入: 使用 Setter 方法传递依赖。字段注入: 用 @Autowired 等注解直接注入依赖(Spring 推荐前两种)。🚀 示例代码解析构造器注入:@Componentpublic class ...
Spring Boot自动配置的机制是什么?
Spring Boot 的自动配置是通过 @EnableAutoConfiguration 注解实现的,它导入了 AutoConfigurationImportSelector 类,负责扫描 classpath 下的 spring.factories 文件并加载相关的自动配置类。这些配置类通过条件注解(如 @ConditionalOnClass 和 @ConditionalOnMissingBean)来灵活控制何时加载配置。在启动时,Spring Boot 会根据项目的依赖和环境条件,自动选择并注入合适的 Bean,简化了配置过程。 📚 知识内容Spring Boot 的自动配置功能是让开发者轻松配置应用的核心特性之一。通过自动化配置,开发者无需手动编写大量的配置代码,Spring Boot 会根据应用环境自动加载合适的 Bean,实现开箱即用的效果。 @EnableAutoConfiguration 注解 🛠️这是实现自动配置的关键注解,通常与 @SpringBootApplication 注解一起使用。它引导 Spring Boot 在应用启动时,自动加载并注入各种所需...
Spring Boot配置文件加载的优先级顺序是什么?
在 Spring Boot 中,配置文件的加载优先级非常重要,它决定了在多个配置源存在时,哪个配置会被应用。Spring Boot 按照以下顺序加载配置: 命令行参数 📝JAR包外的 application-{profile}.properties 📂JAR包内的 application-{profile}.properties 📦JAR包外的 application.properties 📂JAR包内的 application.properties 📦这意味着,若相同的配置项出现在多个配置文件中,优先级高的配置会覆盖优先级低的配置。 📚 知识内容📌 配置文件加载的完整优先级Spring Boot 会按照以下顺序加载配置文件,优先级高的文件会覆盖优先级低的文件: 命令行参数:最高优先级。命令行传入的参数会覆盖所有其他配置来源。 示例: java -jar app.jar –server.port=9090application-{profile}.properties(外部):如果应用运行在特定的 profile(例如 dev、prod),且配置文件存在于...
Spring Boot自动配置的机制是什么?
Spring Boot 的自动配置是通过 @EnableAutoConfiguration 注解实现的,它导入了 AutoConfigurationImportSelector 类,负责扫描 classpath 下的 spring.factories 文件并加载相关的自动配置类。这些配置类通过条件注解(如 @ConditionalOnClass 和 @ConditionalOnMissingBean)来灵活控制何时加载配置。在启动时,Spring Boot 会根据项目的依赖和环境条件,自动选择并注入合适的 Bean,简化了配置过程。 📚 知识内容Spring Boot 的自动配置功能是让开发者轻松配置应用的核心特性之一。通过自动化配置,开发者无需手动编写大量的配置代码,Spring Boot 会根据应用环境自动加载合适的 Bean,实现开箱即用的效果。 @EnableAutoConfiguration 注解 🛠️这是实现自动配置的关键注解,通常与 @SpringBootApplication 注解一起使用。它引导 Spring Boot 在应用启动时,自动加载并注入各种所需...
Spring Boot中常见的Starter有哪些?
Spring Boot 提供了丰富的 Starter 依赖,帮助开发者快速集成各种功能模块。以下是一些常用的 Starter: spring-boot-starter-web:用于开发 Web 应用,嵌入 Tomcat 并支持 Servlet 和 JSP。spring-boot-starter-data-jpa:提供对 JPA(Java Persistence API)的支持,简化数据库操作。spring-boot-starter-data-redis:集成 Redis 数据库,支持缓存和数据存储。spring-boot-starter-data-solr:集成 Apache Solr,支持全文搜索功能。mybatis-spring-boot-starter:第三方 MyBatis 集成 Starter,简化 MyBatis 配置。这些 Starter 极大地简化了 Spring Boot 应用的开发,让开发者可以专注于业务逻辑。 📚 知识内容🌐 1. spring-boot-starter-webspring-boot-starter-web 是开发 Web 应用的核心 S...
Spring Boot 3.x与2.x版本的主要区别和改进是什么?
Spring Boot 3.x 带来了许多令人兴奋的新特性,比如对Jakarta EE 的支持、JDK 17 的最低要求、原生编译支持、更强的观察性、 安全性提升以及更清爽的依赖管理。这些改进让 Spring Boot 3.x 成为现代云原生开发的利器! 📚 知识内容🌐 1. 从 Java EE 到 Jakarta EESpring Boot 3.x 正式拥抱了 Jakarta EE,这意味着一些核心的包名从 javax.* 变成了 jakarta.*。虽然看起来只是包名的变化,但这背后是 Java EE 向 Jakarta EE 的全面迁移。如果你从 2.x 升级到 3.x,记得检查并修改这些包名哦! 代码示例: // Spring Boot 2.ximport javax.persistence.Entity; @Entitypublic class MyEntity {// …} // Spring Boot 3.ximport jakarta.persistence.Entity; @Entitypublic...
Java中的集合类有哪些?它们的分类方式是什么?
Java 中的 集合类 是用来存储和操作数据的一组工具,分为 List、Set、Queue 和 Map 四种类型。每种集合类型根据不同的需求有不同的特点,比如 数据顺序、是否允许重复元素、是否线程安全 等。每种集合类型也有不同的 性能表现,所以根据实际需求选择合适的集合类是提升代码 效率 的一个重要方法。 📚 知识内容🧩 1. 集合框架的基本分类Java 的集合框架包含了很多实现不同接口的类,我们将其分为四大类: List(列表)有序集合,允许重复元素。按插入顺序保存数据,常用的实现类有 ArrayList 和 LinkedList。 Set(集合)不允许重复元素,无序集合。常用的实现类有 HashSet、LinkedHashSet 和 TreeSet。 Queue(队列)按照先进先出(FIFO)原则操作元素,常用的实现类有 PriorityQueue 和 ArrayDeque。 Map(映射)存储键值对,不允许重复的键。常用的实现类有 HashMap、TreeMap 和 LinkedHashMap。 🌱 1.1 List(列表)特点:有序,可以 重复元素,可以通过 索引 ...
JDK 1.8为何在HashMap中引入红黑树改进?
在 JDK 1.8 中,HashMap 引入了 红黑树,用来代替原来的 链表,主要目的是优化 数据冲突 时的性能。简单来说,当某个位置的数据太多,形成很长的链表时,HashMap 会自动把这个链表变成 红黑树,这样就能让 查找、插入 和 删除操作 更加高效。通过这种方式,性能从 原来的慢速度(随数据量增加越来越慢)变成了 更快的速度,避免了链表在大量数据冲突时出现的性能问题。 📚 知识内容🤔 什么是红黑树?红黑树(Red-Black Tree)是一种自平衡的 二叉查找树,它具有以下特点: 每个节点是红色或黑色的。根节点是黑色。每个叶子节点是黑色的。如果一个红色节点有子节点,那么它的两个子节点必须是黑色的。从任何节点到其叶子节点的路径上,黑色节点的数量是相同的。由于这些特性,红黑树能够保证 O(log n) 的查找、插入和删除时间复杂度。 🤔 为什么 HashMap 引入红黑树?在 JDK 1.8 之前,HashMap 在发生哈希冲突时,会将冲突的元素通过 链表 存储。链表的插入、删除和查找操作的时间复杂度是 O(n),当哈希表中的某个槽位发生大量冲突,链表的长度会变得非常长...
Java中ArrayList与LinkedList的区别是什么?
ArrayList 是基于 动态数组 的,它查找数据的速度很快,但 插入 和 删除 数据时会比较慢;而 LinkedList 是基于 双向链表 的,插入和删除数据时速度比较快,但查找数据时比较慢。两者各有优缺点,我们需要根据实际情况来选择合适的方式。 📚 知识内容🧩 1. ArrayList 的核心特点🌳 底层实现数据结构:ArrayList 的底层基于 动态数组。扩容机制:初始容量为 10,当插入的数据超过当前容量时,扩容为原容量的 1.5 倍。扩容时会创建一个新数组,并将旧数组的数据拷贝到新数组中。💡 优缺点优点:查询速度快:因为数组支持随机访问,时间复杂度为 O(1)。内存利用率高:数组是连续存储的,内存分配效率高。缺点:插入和删除效率低:在中间插入或删除数据时,需要移动大量数据,时间复杂度为 O(n)。扩容开销大:扩容时需要重新分配内存并复制数据,性能损耗较高。🛠️ 代码示例:常见操作import java.util.ArrayList; public class ArrayListExample {public static void main(String[...
