自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 Redis的持久化方法,各自优缺点,怎么选择?

redis基于内存是数据库,内容存到内存中,也可以存到硬盘中,这个过程就叫持久化。有两种方案,RDB和AOP两种。RDB持久化就是把当前进程数据生成快照保存到硬盘的过程RDB文件是⼀个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于R DB文件是保存在硬盘上的,所以即使Redis崩溃或者退出,只要RDB文件存在,就可以用它来恢复还原数据库的状态。

2024-05-04 10:00:00 565

原创 SpringBoot自动配置原理

EnableAutoConfiguration注解内部使用@Import({AutoConfigurationImportSelector.class})加载配置类。这个方法返回了一个字符串数组,这个数组里定义了很多需要被加载的类。文件,该配置文件定义了大量的配置类,当SpringBoot启动时,会自动加载这些配置类,初始化Bean。并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean。,点进去,我们看到它实现了这样的方法。

2024-05-02 10:15:00 444 1

原创 自定义SpringBoot的starter

3、在redis-spring-boot-autoconfigure模块中初始化Jedis的Bean。2、创建redis-spring-boot-starter模块,依赖redis-spring-boot-autoconfigure的模块。案例需求:自定义redis-stater。5、在redis-spring-boot-autoconfigure模块中写核心的redis的自动配置类。3、在redis-spring-boot-autoconfigure模块依赖中引入jedis依赖。

2024-05-01 18:25:05 481

原创 自定义@Conditional注解案例,实现动态判断条件,创建Bean

在Spring的IOC容器中有一个User的Bean,现要求:某个字节码存在就创建该Bean。ConditionalOnMissingBean:判断环境中有没有对应Bean才初始化Bean。ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean。ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean。2、自定义注解:@ConditionOnclass。3、加入@ConditionOnclass注解。注释掉jedis依赖。

2024-05-01 11:15:49 397

原创 SpringBoot之@Conditional注解实现选择性的创建Bean操作

Condition 是在Spring 4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作。需求:在Spring的IOC容器中有一个User的Bean,现要求:导入Jedis坐标后,加载该Bean,没导入,则不加载。2、创建ClassCondition类实现Condition接口,重写matches方法。参数context:上下文对象,用于获取环境、IOC容器、ClassLoader对象。我们在代码中加入一个@Conditional注解,查看这个注解。3、获取user,打印出来。

2024-05-01 11:14:59 474 2

原创 AOP核心概念

假如我现在要 crud 写⼀堆业务,可是如何业务代码前后前后进行打印日志和参数的校验呢?我们可以把日志记录和数据校验可重用的功能模块分离出来,然后在程序的执行的合适的地方动态地 植入这些代码并执行。简单说,就是把一些业务逻辑中的相同的代码抽取到⼀个独立的模块中,返回通知 ( @ AfterReturning)异常通知 ( @ AfterThrowing)在不惊动原始设计的基础上为其进行功能增强。环绕通知 ( @ Around )后置通知 ( @ After)前置通知 (@Before)

2024-04-30 21:23:23 52

原创 spring常用注解,超详细

例如,如果一个Controller类上有@RequestMapping("/users")注解,而该类中有一个方法上有@RequestMapping("/list")注解,那么该方法处理的URL将会是"/users/list"。在Spring MVC中,它是用来定义请求URL和处理请求的方法之间的映射关系的。用于接收路径参数,比如 @RequestMapping(“/hello/{name}”) 申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接又实现方法。在方法执行之前与之后执行。

2024-04-30 20:36:25 728

原创 什么是循环依赖?怎么解决循环依赖?为什么一定用三级缓存?

如果是没有代理的情况下,使用⼆级缓存解决循环依赖也是 OK 的。因为三级缓存中放的是生成具体对象的匿名内部类,获取 Object 的时候,它可以生成代理对象,也可以返回普通对象。当某个 bean 进入到 2 级缓存的时候,说明这个 bean 的早期对象被其他 bean 注入了,就是说,这个 bean 还是半成品,还未完全创建好的时候,已经被别人拿去使用了,所以必须要有 3 级缓存,2 级缓存中存放的是早期的被别人使用的对象,如果没有 2 级缓存,是无法判断这个对象在创建的过程中,是否被别人拿去使用了。

2024-04-29 22:27:11 4180 1

原创 Spring Bean生命周期详解,通俗易懂

框架具有高度封装性,我们接触到的一般都是业务代码,一个底层功能API不能轻易的获取到,但是这不意味着永远用不到这些对象,如果用到了,就可以使用框架提供类似的Aware接口,让框架给我们注入对象。postProcessBeforeInitialization方法在初始化方法之前执行,postProcessAfterInitialization在初始化方法之后执行。Spring IOC中的Bean的生命周期大致分为四个阶段:实例化、属性赋值、初始化、销毁。销毁:执行bean销毁方法。常用的Aware接口。

2024-04-29 21:07:00 2823

原创 什么是IOC?IOC底层原理。

使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

2024-04-28 10:56:40 1943 2

原创 BeanFactory和ApplicationContext区别?

ApplicationContext接口常用实现类:FileSystemXmlApplicationContext和ClassPathXmlApplicationContext。ApplicationContext是BeanFactory接口的子接口,提供了更多面向实际应用的功能。在加载配置文件时就会把在配置文件中的对象创建。BeanFactory是类的通用工厂,可以创建并管理各种类的对象。它在加载配置文件时不会创建对象,在获取对象(使用)才会创建对象。

2024-04-28 10:16:36 99 2

原创 LinkedHashMap怎么实现有序的?

LinkedHahMap根据元素的hashcode值确定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来事宜插入顺序保存的,LinkedHashMap维护了一个双向链表,有头尾节点LinkedHashMap节点Entry内部除了继承HashMap的Node属性,还有before和after用于标识前置节点和后置节点。

2024-04-26 09:22:24 109 2

原创 面试题:如何设计实现一个HashMap?

散列函数:hash方法+hash&(table.length-1)扩容:节点重新hash获取位置。

2024-04-25 16:35:41 496 1

原创 HashMap底层机制和源码剖析

首先进行哈希值的扰动,获取⼀个新的哈希值。判断tab是否位空或者长度为0,如果是则进行扩容操作。根据哈希值计算下标,如果对应下标正好没有存放数据,则直接插入即可否则需要覆盖。判断tab[i]是否为树节点,否则向链表中插入数据,是则向树中插入节点。如果链表中插入节点的时候,链表长度大于等于8,则需要把链表转换为红黑树。最后所有元素处理完成后,判断是否超过阈值,超过则扩容。有兴趣的伙伴可以自己debug一下,追一下put的过程。

2024-04-25 10:30:56 7124 4

原创 HashMap中数组下标的计算,为什么HashMap的容量是2的倍数?

length-1 为奇数,奇数的二进制最后一位是 1,这样便保证了 hash &(length-1) 的最后一位可能为 0,也可能为 1(这取决于 h 的值),即 & 运算后的结果可能为偶数,也可能为奇数,比如说 9 % 4 = 1,9 的二进制是 1001,4 - 1 = 3,3 的二进制是 0011,9 & 3 = 1001 & 0011 = 0001 = 1。比如说,数组长度是 3,hash 是 7,那么 7 % 3 的结果就是 1,也就是此时可以把元素放在下标为 1 的位置。进行&运算结果为2。

2024-04-24 23:01:15 6161

原创 HashMap的哈希/扰动函数的设计,为什么能降低hash碰撞?

假如HashMap数组的始大小才16,就需要用之前需要对数组的长度取模运算,得到的余数才能用来访问数组下标。2 进制表⽰是 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1111。这样是要快捷⼀些,但是新的问题来了,就算散列值分布再松散,要是只取最后几位的话,碰撞也会很严重。因为:哈希函数是先拿到key 的hashcode,是⼀个32位的int类型的数值,然后让hashcode的高16位和低16位进行异或操作。

2024-04-24 21:51:44 6517

原创 Java面试高频题:为什么HashMap扩容时加载因子是0.75?原理以及面试时候回答

在概率论和统计学中,二项分布是n个独立的成功/失败试验中成功的次数的离散概率分布,其中每次试验的成功概率为p。我们设的比较小的话,元素比较少,空位比较多的时候就扩容了,发生哈希碰撞的概率就降低了,查找时间成本降低,但是就需要更多的空间去存储元素,空间成本就增加了。假如我们设的比较大,元素比较多,空位比较少的时候才扩容,那么发生哈希冲突的概率就增加了,查找的时间成本就增加了。我们的目的是往长度为s的哈希表中仍n次数据,发生哈希冲突的为0的概率尽可能大些。综上,0.75 是个比较完美的选择。

2024-04-24 17:46:31 7098 1

原创 如何选择集合实现类

要求插入顺序和取出顺序一致:LinkedHashSet,维护数组+双向链表。改查多:ArrayList [底层维护Object类型的可变数组]无序:HashSet [底层是HashMap,维护了一个哈希表]增删多:LinkedList [底层维护了一个双向链表]要求插入顺序和取出顺序一致:LinkedHashMap。读取文件: Properties。排序: TreeMap。排序:TreeSet。1、先判断存储的类型(一组对象或一组键值对)无序:HashMap。一组对象:Collection接口。

2024-04-23 21:25:41 124

原创 Java集合篇之ArrayList与LinkedList比较

1) 如果改查操作多,就选择ArrayList。如何选择ArrayList和LinkedList。2)如果增删操作多,选择LinkedList。

2024-04-22 17:12:02 105

原创 Java 集合篇之Arraylist与Vector的比较

ArrayList如果使用指定容量capacity作为参数的有参构造器,则数组初始容量为capacity。需要扩容时,扩容为数组容量的1.5倍。需要扩容时,扩容为数组容量的1.5倍。Vector如果使用指定容量capacity作为参数的有参构造器,则数组初始容量为capacity。需要扩容时,扩容为数组容量的2倍。Vector如果使用无参构造器,则数组初始容量为10。如果在多线程环境下使用集合类,推荐使用Vector或者通过Collections工具类将ArrayList转换为线程安全的。

2024-04-22 11:30:09 143

空空如也

空空如也

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

TA关注的人

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