- 博客(21)
- 收藏
- 关注
原创 Java并发编程 使用锁和状态位来控制线程的执行顺序
为了控制线程按序执行,这里有2个关键的认识需要了解下:1.锁:通过锁,来保证线程的执行不受并发和并行的影响。这个是使线程执行顺序可控的基础。2.状态位:通过状态位,起到一个线程通知的作用,从而控制线程的执行顺序。
2024-08-03 17:58:06
870
1
原创 Spring IOC和DI的认识
Spring框架为我们提供了一个良好的开发环境,通过引入IOC和DI设计思想的实现,使我们对对象的使用,变得更加自动化。在提高我们开发效率的同时,通过DI解耦,也降低了对象依赖关系硬编码导致的强耦合,使我们的程序代码变得更灵活。
2024-07-28 19:06:36
936
原创 MyBatis like %#{name}%的问题及解决
MyBatis配置文件可知,对SQL的处理,将%占位符与#{}占位符作为一个整体,直接拼接了起来,并且对username这个字段,进行前缀和后缀的模糊匹配。且同时在这个场景中,User表中存在有username列的索引。
2024-07-28 15:44:03
741
原创 Java 线程池的认识
线程池的作用,总的来说,一是为了减轻CPU的工作负担,二是为了方便对线程资源进行管理。通过线程池,我们可以根据自己的业务场景,即任务执行的特点,去定制化的管理线程资源。通过复用线程,以及控制线程创建的数量,来减轻CPU的负担,从而提高系统的运行性能。
2024-07-27 17:01:11
849
原创 Git 修改push到远程仓库的commit提交对象
实现方式:1、git commit --amend :修改最近一次提交对象的内容2、git rebase -i commit + git commit --amend :通过分支变基实现提交对象信息的重写
2024-07-19 12:50:15
794
原创 Tomcat和SpringMVC交互的流程
Spring程序,实现Web交互的基础,分为2个部分,分别为tomcat和springmvc。其中springmvc实现web交互的关键点是DispatcherServlet。
2024-07-18 16:01:16
984
原创 Java HashMap优化Hash冲突的策略
Object类中定义的hashCode():hashCode()方法生成的散列码,默认是对象在内存中的地址。并且由于是int类型,所以可以知道这个散列码是32位的,所以可以表示2^32个不同的值。HashMap中定义哈希表的散列算法是:(n - 1) & hash,相当于n % hash。因为hash有2^32 多种可能,而哈希表的长度可能远小于2^32 位,比如只有2^16位的大小,所以此时的&运算对高16位的计算结果都为0,这就相当于hash高16位的信息被忽略掉了。
2024-06-10 10:00:00
1227
原创 认识并发的三大特性—原子性、有序性、可见性
在了解并发的三大特征之前,我们需要先知道并发是什么。并发是CPU处理线程任务的一种特点。在CPU的一个核心中,可以调度多个线程在这个核心中快速交替的执行。这种交替执行的速率对于我们来说是肉眼不可见的。总的来说,并发是基于CPU的一个核心观察到的一种任务执行的特点。接着我们来了解下线程安全。线程安全是指,当有多个线程在对某个共享资源进行操作时,比如读和写的操作,这个共享资源如果依然能保持正确的状态,那么就可以说明这个共享变量是线程安全的。
2023-12-31 18:00:36
1172
原创 Java 认识ThreadLocal是如何实现线程隔离的
Thread和ThreadLocal之间的关系如图所示。ThreadLocal实例的引用值被封装作为ThreadLocalMap.Entry中的key。在ThreadLocal类中开放了一些API,这些API通过以自身为入口,也就是以ThreadLocal实例的引用值为查询条件,来获取对应ThreadLocalMap.Entry中的value。ThreadLocal.ThreadLocalMap是用来存放数据的。
2023-12-28 10:51:26
1069
原创 Java HashMap表的长度为什么是2的倍数?
这个数值串就是Y%X的计算结果。所以,正是由于二进制运算的这种特性,HashMap在put进一个新元素到哈希表时,如果哈希表的长度为2的倍数,那么就可以直接通过(n - 1) & hash得到 n%hash的结果了。由于位运算的执行效率要比%运算高效很多,所以,通过做位运算,而不是%运算,就能够大大提高对哈希表操作的效率了。
2023-08-22 17:12:37
254
原创 Java String对象在JVM中的内存位置
用一段代码来举例:为一个String对象赋值一个字符串字面量“test”:在启动项目时,在JVM类加载过程的“加载”阶段,当扫描到字节码文件中的“test”字面量时,JVM会把这个字面量存放在运行时常量池中。然后在“解析”阶段,JVM会根据运行时常量池中的这个字符串字面量,在堆中创建出对应的String类对象,然后再把它的引用值存入到字符串常量池中。
2023-07-09 12:55:11
1576
3
原创 Java ArrayList的扩容机制
在calculateCapacity()方法中,会先判断elementData字段是否是初始状态,是的话就会在DEFAULT_CAPACITY字段和本次添加新元素所需的最小容量之间取一个最大值。在进行一系列的计算得到本次扩容的新容量大小后,就会执行java.util.Arrays#copyOf(T[], int)方法将原elementData字段的数据copy给堆中的一个新数组对象中,且这个新数组的容量大小等于本次扩容要求的大小。这个字段是ArrayList类中定义的一个默认的初始数组大小。
2023-07-01 20:30:04
288
原创 Java的StringBuffer是如何存放数据的?
在StringBuffer类对象的内部,采用的是一个名为value,类型为char数组的数据结构来存放数据的,并且这个数组被定义在其父类AbstractStringBuilder类中。在向StringBuffer存放数据的过程中,会根据数据的不同类型采用不同的处理方式。
2023-06-22 19:04:09
275
原创 Java ArrayList实例是否可以存放NULL元素?
当add一个新元素时,如果这个元素是一个null元素,那么在这个方法中也并没有做null校验,它内部的处理逻辑就是把这个新元素直接存到elementData字段的最后一个空间中,而数组对存放null元素本身也并没有做限制。当我们调用add()方法添加一个新元素到ArrayList类中,我们看下elementData字段此时会被怎么处理。根据官方解释,可以了解到这个elementData字段就是用来存放存入到ArrayList类对象中的所有元素。
2023-06-15 17:04:40
715
原创 工厂方法模式 - 设计模式
工厂方法模式(Factory Method pattern)是一种创建型设计模式。它的主要目标是提供一种创建对象的机制:它让类的实例化延迟到子类工厂,被实例的对象将在子类工厂中被确定。
2023-06-09 13:51:01
129
原创 简单工厂模式 - 设计模式
简单工厂模式,也称为静态工厂方法模式,是一种常用的创建型设计模式。在这个模式中,这个工厂类被用来创建对象,客户端以这个类为中介得到所需的对象。这个工厂类通常有一个方法,根据客户端的需求来决定应该创建哪种产品类的实例。
2023-06-08 17:41:21
102
原创 建造者模式(Builder模式)- 设计模式
建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂的对象,并将构建对象的过程流程化。这种模式可以使产品的创建能够在同样的构建流程中创建出不同表现形式的产品,也就是不同种类的产品。这也是它的特点:将产品构建的过程公共化,构建的细节定制化,从而在这样的一套流程里构建出多个不同种类的产品。产品(Product):一个被构建的对象,其包含有多个组成。抽象建造者(Builder):根据产品的组成,定义构建产品的过程。具体建造者。
2023-06-08 16:28:54
177
原创 Optional类中,of()和ofNullable()方法的用法与区别
of(...)方法会返回一个携带被指定的value,且该value不能为NULL;使用ofNullable(...)方法时,若指定的value不为NULL,则会返回携带有该value的Optional类实例,否则就返回一个value值为NULL的Optional类实例。我们可以通过实验来看看这两者之间的区别。
2022-04-26 17:14:03
16028
原创 Optional类的作用和应用场景
我们要养成看官方文档的好习惯,所以先来看看JDK 8官方文档上的解释:从文档中可以看出来,大概的意思就是说Optional是一个基于值的类,它里面会存放一个为NULL或不为NULL的值,也就是value,然后这个类里面的API都是围绕着这个值而被开发的。
2022-04-26 16:00:24
1998
原创 探究Java ArrayList的add(E e)方法
AarrayList的add()方法每次add新元素其实都是直接把形参对应的引用地址存入到数组中。所以我们在开发的时候就要格外的认识到这一点。因为,当我们调用add方法每次都传入相同引用地址的形参时,就会导致:只要改变List中某个元素的内部内容时,就会导致数组中其它下标的元素的内容也跟着一起被改变,这是因为,此时这个数组中的每个元素,实际上指向的都是堆中同一个对象。
2022-02-25 15:51:45
3026
2
原创 探究Collections.singletonList的作用和使用方法
Collections.singletonList被限定只被分配一个内存空间,也就是只能存放一个元素的内容。这样做的好处就是不会造成内存的浪费,不像ArrayList这样的类,不管你是需要多少内存,初始化就会被分配一定空间的内存,就会导致多余内存的浪费。所以在实际的开发中,如果有特殊要求只需要List存放一个的元素,就可以使用Collections.singletonList作为数据结构来存放数据啦。
2022-02-25 14:17:28
66182
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人