- 博客(24)
- 收藏
- 关注
原创 TreeMap源码分析与红黑树实现原理
TreeMap通过红黑树保证数据的有序性,同时提供 O(log n) 级别的查找、插入和删除操作。掌握红黑树的旋转(左旋、右旋)及平衡调整机制,可以更好地理解TreeMap的内部实现!
2025-04-08 16:37:45
901
原创 LinkedHashMap源码分析及LRU实现原理
继承自HashMap,但它额外维护了一个双向链表,用于维护元素的顺序。可以按照插入顺序或访问顺序迭代元素。提供方法,方便实现 LRU 缓存。LinkedHashMap继承自HashMap,但额外维护了双向链表,支持按插入顺序或访问顺序迭代元素。通过 accessOrder = true 和 removeEldestEntry,可以轻松实现 LRU 缓存。afterNodeAccess、afterNodeInsertion和afterNodeRemoval 方法负责维护双向链表,确保访问顺序正确。
2025-03-31 13:51:43
284
原创 HashMap 底层源码分析
null,此时p的值是发生冲突时之前已经存在的值,此时分三种情况判断,判断要添加的hash是否等于冲突的hash值并且key是否相等,如果相等,说明两个对象是同一个对象,把p的值赋值给临时变量e,如果e不为空,先保留老的oldValue值,把之前的value值赋值为要添加的value,即覆盖已经存在的value值,返回老的value值。二是红黑树的情况下;这块的逻辑主要是处理链表桶(非红黑树)的情况,它的主要逻辑是对旧桶中的链表进行重新分配,将节点拆分到新的newTab数组中不同的桶位置。
2025-03-26 15:29:52
1034
原创 LinkedList 底层源码深度解析
本文深入分析了LinkedList与ArrayList在数据结构上的不同,探讨了它们的适用场景及时间复杂度对比。LinkedList作为一个基于双向链表的数据结构,在插入和删除操作方面表现优异,特别适用于频繁插入、删除的场景,而 ArrayList 则在随机访问方面更具优势。在源码分析部分,我们详细解读了LinkedList的底层实现,深入解析了add()方法的多个重载版本,了解了元素如何被插入到链表的不同位置。
2025-03-18 09:38:16
645
原创 深入剖析Java ArrayList源码
*2.1 List接口的实现**作为动态数组的核心契约,List 接口的实现是 ArrayList 的基础能力来源。(1) 动态扩容的 add 方法// 添加单个元素(核心方法)modCount++;// 结构性修改计数器// 内部方法if (s == elementData.length) // 容量已满// 扩容逻辑// 尾部插入// 更新逻辑大小。
2025-03-11 12:35:21
338
原创 ThreadLocal源码分析
ThreadLocal是Thread的局部变量,用于不同线程之间的数据隔离。每个线程都可以通过ThreadLocal获取到属于自己的数据副本,这样各个线程之间的数据不会互相干扰。
2025-02-22 22:16:46
589
原创 SpringBoot整合Aop源码之动态代理调用分析
本文分析了Cglib代理的请求过程的源码,可以总结简化出如下两点调用步骤1.把能应用于目标对象的Advisor数组转换为包含各种前置通知、异常通知、后置通知等的MethodInterceptor对象集合。2.通过责任链模式依次调用MethodInterceptor对象的invoke方法执行通知方法,在后置通知中有个finally代码块会最后被执行。
2024-02-12 22:59:45
796
1
原创 SpringBoot整合Aop源码之Aop生成动态Cglib代理源码分析
1.AOP先通过AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation创建一个增强器的集合,创建的逻辑主要是查找spring容器中标有@Aspectj注解的类,并且方法标有Pointcut、Around、Before、After、AfterReturning、AfterThrowing注解给他们封装为增强器对象。
2024-02-12 22:57:06
1179
1
原创 SpringBoot整合Aop源码之Aop的加载过程分析
什么是AOP?AOP(面向切面编程)是一种软件开发范式,旨在通过在程序中插入称为“切面”的特殊代码,来提高代码的可维护性、可重用性和可扩展性。切面是与业务逻辑无关的代码,用于横切关注点,例如日志记录、性能监测、事务管理等。在传统的面向对象编程中,应用程序的逻辑通常被分解为多个对象,这些对象协同工作以完成任务。而AOP允许你通过横切关注点的方式来封装这些协同工作,从而提高代码的模块化程度。AOP中的关键概念切面是一个模块化单元,其中包含有关横切关注点的信息。它包含了切点、通知和一些其他配置。切点是一个表达式,
2024-02-12 22:53:57
790
1
原创 SpringBoot整合Ribbon源码分析之核心组件之间调用流程分析
通过这个方法还可以看出一个知识点,就是nextIndex是CAS操作,它是一个原子操作,它是比较内存中的值和当前值是否相等,如果相等把值设置为指定的值,如果不等,会在死循环for中判断直到相等为止才返回。
2024-02-08 00:02:24
709
原创 SpringBoot整合Ribbon源码分析之核心组件加载原理
在我的初次探讨中,我深入剖析了Ribbon的核心构建要素。NacosRibbonClientConfiguration会先加载里面的Bean,如果没有会加载RibbonClientConfiguration中的Bean,而RibbonClientConfiguration中的Bean都是@ConditionalOnMissingBean标注的,这表明如果容器中存在这个Bean就不会加载这个Bean,以我们的NacosRibbonClientConfiguration中配置的Bean为最优先加载的。
2024-02-08 00:00:08
1481
原创 SpringBoot整合Ribbon源码分析之Ribbon简介和核心组件
维护着一组Server实例列表,在应该程序运行过程中,Ribbon通过ServerList中的服务实例供负载均衡选择,ServerList维护的实例列表可能在运行过程中发生动态变化。
2024-02-07 23:52:43
468
1
原创 Spring Cloud OpenFeign源码请求原理解析
请求到达时候会调用FeignInvocationHandler的invoke方法,创建一个RequestTemplate对象设置请求头参数等信息,这些可能是在请求拦截器中设置的,接着调用远程服务获取响应对象,把响应对象解码成为我们Feign接口返回的类型,当服务不可用时候还可以进行重试机制,默认最大为5次,如果5次过后还是请求不到会抛出异常。总体来说,这段代码的作用是在发生可重试异常时,判断是否需要进行重试,如果需要,计算下一次重试的时间间隔,并在间隔后进行重试。
2024-02-05 09:05:49
897
1
原创 Spring Cloud OpenFeign源码FeignClientFactoryBean原理
接着创建一个数据结构是Map<Method, MethodHandler>的对象,遍历标有@FeginClient注解的接口类的方法,这个方法是通过反射获取的,是java.lang.reflect.Method对象,放入到Map中,key是java.lang.reflect.Method对象对象,value是MethodHandler对象,该对象是通过ParseHandlersByName的apply方法封装而来的。由于这个方法代码量很大就不在此做分析了。new Class<?
2024-02-04 18:36:35
973
1
原创 Spring Cloud OpenFeign源码加载原理
本节主要分析了Feign是怎么被加载到Spring容器中的,其实主要就是在我们的启动类中添加@EnableFeignClients注解,然后注解又引入了一个FeignClientsRegistrar,它是Spring容器会回调的一个类,它是去指定的包路径下寻找所有子包标有@FeginClient注解的类并把他们封装为FeignClientFactoryBean类型的Bean加载到spring容器中。根据Map获取@Feign注解的value值,又调用了。
2024-02-04 18:31:03
848
1
原创 SpringBoot整合Mybatis-Plus源码分析(二)
MybatisSqlSessionFactoryBean对象的getObject()方法的主要处理逻辑就是设置自定义相应的别名包中的类、自定义的java类和数据库映射的TypeHandler设置到MybatisConfiguration对象上,同时解析mapper.xml中的标签和CRUD的sql语句到MybatisConfiguration对象上,最后MybatisConfiguration对象设置到SqlSessionFactory对象成员属性上进行返回,这样就有了数据库各种的sql语句了。
2023-06-21 21:33:07
221
原创 SpringBoot整合Mybatis-Plus源码分析(一)
例如,可以通过配置 mybatis-plus.mapper-locations 属性指定 Mapper 接口的扫描路径,或者通过配置 mybatis-plus.global-config.db-config.logic-delete-value 和 mybatis-plus.global-config.db-config.logic-not-delete-value 属性指定逻辑删除的值。Mybatis-Plus 是 Mybatis 的增强工具包,可以简化 Mybatis 的开发,提高开发效率和代码质量。
2023-06-21 21:30:32
521
原创 关于Java8中为什么日期LocalDate是线程安全的分析
前几篇文章分析了Java8中新的日期API各种类的用法,这篇文章分析一下新的API为什么是线程安全的,Java 8 的日期和时间类之所以是线程安全的,因为它们是不可变的(immutable)。在这个示例中,我们创建了两个线程,并且每个线程都使用LocalDate.now()方法获取当前日期,并将其打印出来。当然,如果在多线程中把他用作成员变量的话应该加final关键字修饰,不能让这个变量在别的线程中指向新的对象,那样还是线程不安全的,例如在别的线程又重新赋值一遍。那么其余线程看到的日期的状态将会被改变。
2023-06-18 15:54:52
731
1
原创 Java8中UTC的概念和Java8中新的日期Api UTC和本地时间时间转换
例如,java.time.LocalDateTime 表示本地日期和时间,而 java.time.ZonedDateTime 表示特定时区的日期和时间。它是基于原子钟的国际时间标准,与地球自转无关,通过原子钟的精确测量来确保时间的一致性。通过以上代码示例,您可以获取当前的 UTC 日期时间,并将其转换为本地时间以供使用。在应用程序中,使用 UTC 时间有助于确保时间的一致性和可比性。请注意,UTC 时间并不考虑夏令时调整,因此在进行本地时间转换时,可能会考虑当前系统所处的时区以进行相应的调整。
2023-06-18 15:53:26
3173
1
原创 Java8 Duration和Period详细分析
Duration`和`Period`类提供了对时间间隔和日期间隔的处理和操作。`Duration`适用于处理较短的时间间隔,涉及时分秒和纳秒级别的差距,而`Period`适用于处理较长的日期间隔,涉及年、月和日的差距。Java 8引入了`Duration`和`Period`类,用于处理时间间隔和日期间隔的不同情况。- 可以使用静态方法`of()`创建`Duration`对象,传递不同单位的时间值。- 可以使用静态方法`of()`创建`Period`对象,传递年、月和日的值。
2023-06-16 12:01:52
380
1
原创 Java8时间类Instant以及ZoneId用法
/ 将Instant对象转换为指定时区的ZonedDateTime对象。它是不可变的,可以用来表示一个时间戳,例如系统的当前时间。这些是Instant类和ZoneId类的一些常见用法示例,可以根据具体需求进行进一步学习和应用。它定义了世界上各个时区的标识符,并提供了一些有用的方法来操作时区。在java 8中,Instant类和ZoneId类是用于处理日期和时间的重要类。
2023-06-13 09:40:29
1569
1
原创 Java 8 TemporalAdjusters 使用详解
TemporalAdjusters` 类提供了一些常用的日期调整器,如 `next()`、`previous()`、`firstDayOfMonth()`、`lastDayOfMonth()` 等,方便我们对日期进行灵活的调整和定位。你也可以根据需要自定义日期时间调整器,通过实现 `TemporalAdjuster` 接口来实现自定义的调整逻辑。`TemporalAdjusters` 类是 Java 8 提供的工具类,用于进行日期时间的调整和定位。// 自定义调整器:将日期调整为下一个工作日(跳过周末)
2023-06-12 16:51:29
723
1
原创 Java8 LocalDate使用详解
这些代码示例展示了 `LocalDate` 类的一些常用操作和方法。请注意,`LocalDate` 是不可变的,每个操作都会返回一个新的 `LocalDate` 对象,原始对象不会被修改。`LocalDate` 类是 Java 8 新增的日期时间类之一,用于表示不包含时间的日期。下面是对 `LocalDate` 类的详细分析,并给出一些代码说明。// 获取星期几(返回一个枚举值)// 比较两个日期的先后顺序。// 判断两个日期是否相等。// 格式化日期为字符串。// 解析字符串为日期。
2023-06-11 08:47:13
259
1
原创 Java8 LocalTime使用详解
这些代码示例展示了 `LocalTime` 类的一些常用操作和方法。请注意,`LocalTime` 是不可变的,每个操作都会返回一个新的 `LocalTime` 对象,原始对象不会被修改。`LocalTime` 类是 java 8 新增的日期时间类之一,用于表示不包含日期的时间。下面是对 `LocalTime` 类的详细分析,并给出一些代码说明。// 获取时间的纳秒部分(仅适用于 Java 9+)// 比较两个时间的先后顺序。// 判断两个时间是否相等。// 格式化时间为字符串。// 解析字符串为时间。
2023-06-10 21:03:26
794
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人