自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 资源 (2)
  • 问答 (5)
  • 收藏
  • 关注

原创 Mybatis是如何进行分页的?分页插件的原理是什么?

下面我们详细分析 MyBatis 的分页实现方式以及分页插件的原理。分页或分页插件实现分页,分页插件通过拦截 SQL 并动态生成分页逻辑,简化了分页操作。MyBatis 本身并没有直接提供分页功能,但可以通过以下几种方式实现分页。:根据数据库方言(如 MySQL、Oracle)生成分页 SQL。,在 SQL 执行前动态修改 SQL 语句,添加分页逻辑。MyBatis 可以通过手动分页、Java 代码分页、分页插件自动处理分页逻辑,开发者只需关注业务逻辑。的分页是在内存中进行的,不适合大数据量分页。

2025-03-03 11:18:28 326

原创 在Mybatis中,通常一个Xml映射文件,都会写一个Dao接口与之对应, 请问,这个Dao接口的工作原理是什么?Dao接口里的方法, 参数不同时,方法能重载吗

Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符 串作为key 值,可唯一定位一个MapperStatement。实现的,MyBatis 会在运行时为 Dao 接口生成代理对象,并将接口方法的调用映射到对应的 SQL 语句上。原因:MyBatis 通过方法名和 XML 映射文件中的 SQL 语句 ID 进行映射,如果方法名相同,MyBatis 无法区分不同的方法。Dao 接口的工作原理是基于动态代理,MyBatis 不支持方法重载,但可以通过不同的方法名、

2025-02-25 17:49:58 563

原创 在 MyBatis 中,模糊查询like语句该怎么写?

是 MyBatis 的预编译占位符,可以防止 SQL 注入。是 MyBatis 的字符串替换占位符,直接替换为参数值。通配符,但存在 SQL 注入风险,需谨慎使用。标签,可以在 SQL 语句中动态生成参数值。在 MyBatis 中实现模糊查询,可以使用。标签用于在 SQL 语句中动态生成参数值。占位符,并在 SQL 中直接拼接。占位符,并在参数值中手动添加。在 SQL 语句中,可以使用。在 SQL 语句中,可以使用。在 SQL 语句中,可以使用。占位符,防止 SQL 注入。占位符,防止 SQL 注入。

2025-02-25 17:44:20 318

原创 Mybatis中,当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

是 MyBatis 中最灵活的映射方式,可以显式地指定实体类属性与数据库字段的对应关系。MyBatis 支持自动将数据库字段的下划线命名转换为实体类属性的驼峰命名。在 SQL 查询中,可以通过别名将数据库字段名映射到实体类属性名。、SQL 别名、自动驼峰命名映射或注解配置来解决映射问题。关键字为字段设置别名,别名与实体类属性名一致。当实体类属性名与数据库字段名不一致时,可以通过。注解用于指定单个属性的映射关系。属性指定数据库表的字段名。属性指定实体类的属性名。标签用于映射主键字段。注解显式指定映射关系。

2025-02-25 17:40:04 373

原创 在Mybatis中,#{}和${}的区别是什么?

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?使用#{}可以有效的防止 SQL注入,提高系统安全性。是两种不同的占位符,用于在 SQL 语句中插入参数。是字符串替换占位符,存在 SQL 注入风险,适合动态生成 SQL 语句的部分内容。是 MyBatis 的字符串替换占位符,用于直接替换 SQL 语句中的部分内容。:直接替换 SQL 语句中的内容,存在 SQL 注入风险。替换为实际的参数值,生成完整的 SQL 语句。替换为实际的表名,生成完整的 SQL 语句。设置参数,防止 SQL 注入。

2025-02-25 16:44:34 436

原创 MyBatis与Hibernate有哪些不同?

Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常 适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性, 如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的 软件,如果用hibernate 开发可以节省很多代码,提高效率。

2025-02-25 16:18:39 672

原创 MyBatis框架适用场合

MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成 SQL 语句,适用于需要动态构建查询的场景。:在已有的系统中,如果已经有大量优化过的 SQL 语句,MyBatis 可以轻松集成这些 SQL,而无需重写。:当应用程序需要执行复杂的 SQL 查询时,MyBatis 的灵活性使得编写和优化 SQL 变得更加容易。:MyBatis 提供了插件机制,允许开发者通过自定义插件扩展框架的功能,适合需要高度定制化的项目。:MyBatis 的学习曲线平缓,适合需要快速开发和迭代的项目。

2025-02-25 15:13:10 256

原创 MyBatis框架的缺点

MyBatis 的缺点包括学习成本高、SQL 与代码分离的局限性、性能问题、缺乏自动化、插件机制的局限性以及与 ORM 框架的对比不足。:MyBatis 的插件机制虽然强大,但开发自定义插件需要深入理解 MyBatis 的内部机制,增加了开发难度。:MyBatis 要求开发者熟悉 SQL 语句的编写和优化,对于不熟悉 SQL 的开发者来说,学习成本较高。:MyBatis 的 XML 配置文件和注解配置需要一定的学习成本,尤其是对于复杂的映射关系和动态 SQL。参数未经过滤,可能导致 SQL 注入。

2025-02-25 15:08:48 226

原创 Mybaits的优点

基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML里,解除 sql与程序代码的耦合,便于统一管理;MyBatis 的优点包括 SQL 与代码分离、灵活的映射、动态 SQL、缓存机制、插件机制、易于集成和轻量级,使其成为 Java 开发中广泛使用的持久层框架。:MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成 SQL 语句,避免编写大量重复的 SQL。:MyBatis 提供了与 Spring 框架的无缝集成,简化了配置和管理。

2025-02-25 12:18:08 895

原创 什么是Mybatis?

MyBatis 将 SQL 语句从 Java 代码中分离出来,存储在 XML 文件或注解中,使得 SQL 更易于维护和管理。MyBatis 是一个灵活且高效的持久层框架,通过将 SQL 与代码分离,简化了 Java 应用程序与关系型数据库的交互。MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成 SQL 语句,减少重复代码。表示与数据库的一次会话,用于执行 SQL 语句、提交事务和获取映射器(Mapper)。用于存储 MyBatis 的全局配置信息,如数据源、映射器、缓存等。

2025-02-25 12:09:07 583

原创 Java线程的生命周期?线程有几种状态

运⾏的线程执⾏wait⽅法,该线程会释放占⽤的所有资源,JVM会把该线程放⼊“等待 池”中。:运⾏的线程执⾏sleep或join⽅法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。在 Java 中,线程的生命周期可以分为多个状态,每个状态表示线程在不同阶段的运行情况。该状态的线程位于可运⾏线程池中,变得可运⾏,等待获取CPU的使⽤权。:运⾏的线程在获取对象的同步锁时,若该同步锁被别的线程占⽤,则JVM会把该线程放⼊“锁池”中。运⾏状态(Running):就绪状态的线程获取了CPU,执⾏程序代码。

2025-02-20 17:21:55 969

原创 JVM参数有哪些?

不稳定参数: -XX 开头,这⼀类参数是跟特定HotSpot版本对应的,并且变化⾮常⼤。VM 参数用于配置和调优 Java 虚拟机的行为,包括内存管理、垃圾回收、类加载、性能监控等方面。⾮标准指令: -X开头,这些指令通常是跟特定的HotSpot版本对应的。JVM 参数包括标准参数、非标准参数、高级参数、调试参数和性能监控参数,用于配置和调优 JVM 的行为。标注指令: -开头,这些是所有的HotSpot都⽀持的参数。标准参数是所有 JVM 实现都支持的参数,通常以。:打印所有 JVM 参数的最终值。

2025-02-20 15:44:28 701

原创 什么是三色标记?

三色标记是一种用于垃圾回收的算法,通过将对象标记为白色、灰色和黑色来跟踪对象的可达性,支持并发标记,减少暂停时间,提高垃圾回收的准确性和灵活性。应用线程将一个白色对象引用的黑色对象断开引用,导致白色对象被错误地标记为活动对象。应用线程将一个黑色对象引用的白色对象断开引用,导致白色对象被错误地回收。并发遍历灰色对象,将其引用的白色对象标记为灰色,并将自身标记为黑色。:遍历灰色对象,将其引用的白色对象标记为灰色,并将自身标记为黑色。遍历灰色对象,将其引用的白色对象标记为灰色,并将自身标记为黑色。

2025-02-19 16:52:57 610

原创 在项目中,如何排查JVM的问题

在项目中排查 JVM 问题是一个系统化的过程,通常需要结合日志分析、监控工具、性能调优和代码审查等多种手段。下面我们从常见问题、排查步骤和工具使用等方面详细分析如何排查 JVM 问题。1. 常见的 JVM 问题(1)内存问题内存泄漏(Memory Leak):对象无法被垃圾回收,导致内存占用持续增长。内存溢出(OutOfMemoryError):堆内存或方法区内存不足,无法分配新对象。(2)性能问题CPU 使用率过高:某些线程占用大量 CPU 资源。GC 频繁或耗时过长:垃圾回收导致应用暂停时间过长。

2025-02-19 15:25:30 675

原创 什么是STW?

是 JVM 垃圾回收(Garbage Collection, GC)过程中的一种现象,指的是在垃圾回收的某些阶段,JVM 会暂停所有应用线程(即停止所有正在执行的 Java 代码),以便安全地执行垃圾回收操作。STW 是垃圾回收过程中暂停所有应用线程的现象,目的是确保垃圾回收的准确性和简化实现,但会影响应用的响应速度和吞吐量。在某些垃圾回收器中,压缩阶段需要暂停应用线程,以将活动对象移动到内存的一端,减少内存碎片。在某些垃圾回收器中,清除阶段需要暂停应用线程,以释放未被标记的对象占用的内存。

2025-02-19 13:23:51 740

原创 ⼀个对象从加载到JVM,再到被GC清除,都经历了什么过程?(生命周期)

一个对象从加载到 JVM,再到被 GC 清除,经历了类的加载、对象的创建、对象的使用、对象的不可达、垃圾回收和对象的清除等阶段。一个对象从加载到 JVM,再到被 GC 清除,经历了多个阶段的生命周期。对象不再被任何活动对象引用,GC 会将其标记为可回收对象,并在适当的时候释放其占用的内存。-> 多⼤年龄才会移⼊⽼年代?堆中的对象,经过Full GC,就会被标记为垃圾,然后被GC线程清理掉。:从 GC Roots 出发,遍历所有可达对象,并标记它们为活动对象。:调用对象的构造方法,完成对象的初始化。

2025-02-19 13:19:27 822

原创 垃圾回收分为哪些阶段

CMS不同的是,G1可以采⽤拷⻉算法,直接将整个Region中的对象拷⻉到另⼀个Region。垃圾回收分为标记、清除、压缩和复制四个阶段,分别负责识别活动对象、释放内存、减少内存碎片和复制对象。的根对象出发,通过引用链遍历所有可达对象,并标记它们为活动对象。GC 将所有活动对象移动到内存的一端,并更新引用这些对象的指针。压缩阶段的任务是将所有活动对象移动到内存的一端,减少内存碎片。标记阶段的任务是识别出所有活动对象(即仍然被引用的对象)。清除阶段的任务是释放所有未被标记的对象占用的内存。

2025-02-19 09:59:01 449

原创 怎么确定⼀个对象到底是不是垃圾?

JVM 通过可达性分析算法判断对象是否可以被回收,从 GC Roots 出发遍历所有可达对象,未被遍历到的对象被认为是不可达的,可以被回收。虚引用不会影响对象的生命周期,主要用于对象回收时的通知机制。内存中,从引用根对象向下⼀直找引用,找不到的对象就是垃圾。对象不再被任何活动对象引用,处于不可达状态,可以被回收。最常见的引用类型,只要强引用存在,对象就不会被回收。未被遍历到的对象被认为是不可达的,可以被回收。的根对象出发,通过引用链遍历所有可达对象。未被标记的对象被认为是不可达的,可以被回收。

2025-02-18 17:20:15 632

原创 JVM有哪些垃圾回收算法?

在 JVM 中,垃圾回收算法是垃圾回收器(Garbage Collector, GC)的核心组成部分,用于识别和回收不再使用的对象。JVM 提供了多种垃圾回收算法,包括标记-清除、标记-整理、复制算法、分代收集、增量收集、并发标记清除和 G1 算法,每种算法适用于不同的场景和需求。在标记阶段跟标记清除算法是⼀样的,但是在完成标记之后,不是直接清理垃圾内存,⽽是将存活对象 往⼀端移动,然后将端边界以外的所有内存直接清除。根据对象的生命周期采用不同的回收策略,提高了垃圾回收的效率。

2025-02-18 15:54:06 534

原创 ZGC 和 Shenandoah GC 两者的区别

尽管它们的目标相似,但在实现原理、性能特点和适用场景上存在一些区别。下面我们从多个方面详细对比 ZGC 和 Shenandoah GC。ZGC 和 Shenandoah GC 都是低延迟垃圾回收器,在某些场景下,吞吐量可能略低于 Shenandoah GC。兼容性较好,支持 JDK 12 或更高版本。算法,两者在实现原理和性能特点上略有不同。极低延迟,暂停时间通常小于 10 毫秒。极低延迟,暂停时间通常小于 10 毫秒。在某些场景下,吞吐量可能略低于 ZGC。支持 TB 级别堆内存。

2025-02-18 14:37:12 696

原创 JVM有哪些垃圾回收器?

JVM 提供了多种垃圾回收器,包括 Serial GC、Parallel GC、CMS GC、G1 GC、ZGC、Shenandoah GC 和 Epsilon GC,每种回收器适用于不同的场景和需求。多线程并发执行垃圾回收,减少暂停时间(Stop-The-World)。并发标记-整理算法(Concurrent Mark-Compact)。标记-整理算法(Mark-Compact)。标记-整理算法(Mark-Compact)。标记-复制算法(Mark-Copy)。复制算法(Copying)。

2025-02-18 13:02:11 686

原创 垃圾回收分为哪些阶段

垃圾回收(Garbage Collection, GC)是 JVM 自动管理内存的机制,它通过回收不再使用的对象来释放内存空间。的根对象出发,通过引用链遍历所有可达对象,并标记它们为活动对象。四个阶段,分别负责识别活动对象、释放内存、减少内存碎片和复制对象。GC 将所有活动对象移动到内存的一端,并更新引用这些对象的指针。压缩阶段的任务是将所有活动对象移动到内存的一端,减少内存碎片。标记阶段的任务是识别出所有活动对象(即仍然被引用的对象)。清除阶段的任务是释放所有未被标记的对象占用的内存。

2025-02-18 11:04:23 793

原创 线程共享区和线程私有区两者有哪些优点和缺点

线程共享区中的数据可能被多个线程同时访问,需要额外的同步机制(如锁、原子操作)来保证线程安全。线程共享区是所有线程共享的,避免了为每个线程重复分配内存,节省了内存空间。线程私有区是每个线程独立拥有的,不存在多线程竞争问题,无需额外的同步机制。线程私有区中的数据无法直接共享,需要通过线程共享区(如堆)进行数据传递。线程私有区的内存分配和释放由线程自己管理,避免了复杂的内存管理逻辑。线程共享区中的数据可以被所有线程访问,方便线程间的数据共享和通信。适合存储需要被多个线程共享的数据,如全局配置、缓存、对象池等。

2025-02-18 11:02:31 233

原创 JVM中哪些是线程共享区和线程私有区

如果当前线程正在执行本地方法(Native Method),程序计数器的值为空(Undefined)。JVM 中的线程私有区包括程序计数器、虚拟机栈和本地方法栈,用于存储线程私有的数据和方法调用信息。是每个线程独立拥有的内存区域,用于存储线程私有的数据。如果当前线程正在执行 Java 方法,程序计数器存储的是虚拟机字节码指令的地址。程序计数器是线程私有的,每个线程都有自己的程序计数器。本地方法栈是线程私有的,每个线程都有自己的本地方法栈。虚拟机栈是线程私有的,每个线程都有自己的虚拟机栈。

2025-02-17 14:49:39 603

原创 说说类加载器双亲委派模型

Java 中的类加载器按照层次结构组织,每个类加载器都有一个父类加载器(除了 Bootstrap ClassLoader)。双亲委派模型通过委托父类加载器加载类,确保类的唯一性和安全性,是 Java 类加载器的核心工作机制。当一个类加载器收到加载类的请求时,首先委托父类加载器尝试加载。:在模块化系统中,不同的模块可能需要使用不同的类加载器加载类。如果所有父类加载器都无法加载该类,则由当前类加载器尝试加载。如果类未被加载,类加载器将加载请求委托给父类加载器。如果父类加载器无法加载,则由自己加载。

2025-02-17 11:48:01 895

原创 GC如何判断对象可以被回收

GC 从 GC Roots 出发,遍历所有可达对象,并标记它们为活动对象。GC 将不可达对象标记为可回收,并在适当的时候释放其占用的内存。遍历所有可达对象,未被遍历到的对象被认为是不可达的,可以被回收。虚引用不会影响对象的生命周期,主要用于对象回收时的通知机制。对象不再被任何活动对象引用,处于不可达状态,可以被回收。最常见的引用类型,只要强引用存在,对象就不会被回收。无论内存是否充足,弱引用指向的对象都会被回收。的根对象出发,通过引用链遍历所有可达对象。未被遍历到的对象被认为是不可达的,可以被回收。

2025-02-17 11:27:49 831

原创 Java中有哪些类加载器

在 Java 中,类加载器(ClassLoader)负责将类的字节码加载到 JVM 中,并生成对应的。

2025-02-14 14:13:47 586

原创 Java中的异常体系是怎样的

下面我们从整体结构、分类、常见异常和错误等方面详细分析 Java 的异常体系。Java 中的异常体系是一个层次化的结构,所有异常和错误都继承自。通常表示外部因素导致的异常,如文件不存在、网络中断等。表示严重的系统错误,通常与程序逻辑无关,程序无法处理。必须在代码中显式处理(捕获或抛出),否则编译不通过。不需要在代码中显式处理,编译时不会检查。表示程序无法处理的严重错误。JVM 无法找到类的定义时抛出。:表示程序无法处理的严重错误。:表示程序可以处理的异常。尝试加载不存在的类时抛出。

2025-02-14 12:09:04 483

原创 什么是字节码?采用字节码的好处是什么?

采⽤字节码的好处:Java语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问 题,同时⼜保留了解释型语⾔可移植的特点。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每⼀条要执行的字节码送给解释器,解释器将其翻译成特定机 器上的机器码,然后在特定的机器上运⾏。Java源代码---->编译器---->jvm可执⾏的Java字节码(即虚拟指令)---->jvm>jvm中解释器----->机器可执⾏的⼆进制机器码---->程序运⾏。文件中包含的就是字节码。

2025-02-14 12:02:10 654

原创 CopyOnWriteArrayList的底层原理是怎样的

的底层通过写时复制机制来保证线程安全,适合读多写少的场景,避免了传统的锁机制,提高了并发性能,但在频繁修改数据时性能较差。

2025-02-14 11:57:27 390

原创 HashMap的扩容机制原理

扩容的目的是在哈希表中的元素数量增加时,减少哈希冲突,维持较低的负载因子,从而保证查找、插入和删除操作的时间复杂度接近 O(1)。由于扩容是触发式的,且容量翻倍,分摊到每次插入操作的时间复杂度为 O(1)。遍历原数组中的每个桶,将每个键值对重新计算哈希值,并放入新数组的对应桶中。扩容的时间复杂度为 O(n),其中 n 是 HashMap 中的元素数量。扩容时,HashMap 会创建一个新的数组,容量为原数组的 2 倍。,表示当哈希表中的元素数量达到容量的 75% 时,触发扩容。

2025-02-14 11:46:09 550

原创 什么是深拷⻉ 和 什么是浅拷⻉

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制时的两种方式,它们的区别主要在于。,而是直接复制引用的地址。因此,浅拷贝后的对象与原对象仍然共享相同的引用类型数据。希望这个解释能帮到你!如果有问题,可以继续讨论 😊。,确保拷贝后的对象和原对象完全独立,互不影响。深拷贝不仅复制对象本身,还。

2025-02-14 11:42:04 283

原创 泛型中extends和super的区别

在 Java 泛型中,

2025-02-14 11:37:22 275

原创 谈⼀下HashMap的Put⽅法

此时会检查该桶中的链表或红黑树是否存在该键,若存在则更新值,若不存在则插入新的键值对。方法负责扩容的过程,它会创建一个新的更大的数组,并将原数组中的所有元素重新计算位置并搬移到新数组中。的核心方法之一,它在插入元素、更新元素、处理哈希冲突和扩容等方面扮演着非常重要的角色。会根据计算出的哈希值,确定该键值对应该插入到数组的哪个位置。会根据冲突链表的长度或者桶中的结构来选择合适的存储方式。会创建一个新的节点,将该节点插入到链表或红黑树中。,将现有的元素迁移到新的、更大的数组中。插入一个新的键值对时,会检查。

2025-02-14 11:36:37 893

原创 Jdk1.7到Jdk1.8 HashMap 发生了什么变化?(从底层角度看)

进行了几乎全面的优化,最显著的是引入了红黑树来优化长链表的查询性能,改进了扩容的过程,避免了在扩容时进行一次性大量的数据迁移,同时改进了对容量和负载因子的处理,从而提升了性能。:当一个桶内的元素越来越多时,查询性能会下降。如果桶内的链表非常长,最坏情况下查找时间复杂度会退化成 O(n),这显然会影响性能。扩容时,所有的元素都会被重新计算并插入到新的桶中。扩容的时间复杂度是 O(n),需要把所有元素重新计算哈希值并插入。当哈希冲突发生时,所有冲突的元素会按照插入顺序,链接在一个链表中。

2025-02-14 11:35:27 653

原创 sizeCtl 的具体作用、为什么采用 (e.hash & oldCap) == 0 进行链表拆分

sizeCtl是的扩容“控制器”,它管理扩容的阈值和状态,确保扩容按计划进行。用来决定扩容时元素应该留在原来的位置还是移动到新的位置,确保数据均匀分布在新数组里。

2025-02-14 11:28:53 245

原创 谈谈ConcurrentHashMap的扩容机制

发现没有正在进⾏扩容,则将key-value添加到ConcurrentHashMap中,然后判断是否超过阈值,超过了则进⾏扩容。在转移元素时,先将原数组分组,将每组分给不同的线程来进⾏元素的转移,每个线程负责⼀组或多组的元素转移⼯作。当某个线程进⾏put时,如果发现ConcurrentHashMap正在进⾏扩容那么该线程⼀起进⾏扩容。有一些相似之处,但由于它支持并发操作,扩容时需要额外的同步控制,以保证线程安全。扩容的判断也是每个Segment内部单独判断的,判断是否超过阈值。如果某个线程put时,

2025-02-14 11:26:47 861

原创 HashMap和HashTable有什么区别?其底层实现是什么?

接口,但在特性、性能和底层实现上有显著的区别。下面我们从多个方面详细对比它们的区别,并深入分析它们的底层实现。),数组的每个元素是一个链表或红黑树(Java 8 之后,当链表长度超过阈值时会转换为红黑树)。冲突的键值对会存储在同一个桶(Bucket)中,形成链表或红黑树。当元素数量超过容量与负载因子的乘积时,会触发扩容。:默认初始容量 11,扩容时容量翻倍加 1。当两个键的哈希值相同时,会发生哈希冲突。:默认初始容量 16,扩容时容量翻倍。:非线程安全,性能高,允许。:线程安全,性能低,不允许。

2025-02-14 11:11:02 625

原创 ConcurrentHashMap原理,jdk7和jdk8版本的区别

它在 JDK 7 和 JDK 8 中的实现原理有显著的区别,主要是为了提高并发性能和扩展性。锁的粒度从段级别缩小到桶级别(每个桶是一个链表或红黑树),进一步减少了锁竞争。当链表长度超过阈值(默认 8)时,链表会转换为红黑树,提高查找性能。数据结构更高效,链表和红黑树的结合提高了查找性能。获取段的锁,然后在段内的哈希表中插入或更新键值对。,锁的粒度从整个表缩小到段级别,减少了锁竞争。),每个段是一个独立的哈希表,拥有自己的锁。分段锁的粒度仍然较大,高并发场景下性能有限。:尽量减少锁的竞争,提高并发性能。

2025-02-14 11:10:52 588

原创 Java中的编译器和解释器

每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节 码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机 器上的机器码,然后在特定的机器上运行。在Java中,这种供虚拟机理解的代码叫做 字节码(即扩展名为 .class的文件),它不面向任何特定的处理器,只面向虚拟机。Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器>机器可执行的二进制机器码>程序运行。

2025-02-14 11:10:40 534

世界五百强面试经典教材

世界五百强面试经典教材

2023-05-01

01.Java教程-基础必备--2.Java核心基础好评30天入门---Eclipse、IDEA通用配置

Eclipse、IDEA通用配置

2022-08-03

Web京东网站制作(视频、源码和笔记)

百度云链接永久有效 请放心 Web京东网站制作视频+源码

2018-09-19

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除