自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Git-修改push到远程仓库的commit提交对象

提交的commit,命名给错了,且这个commit已经被push到远程仓库上了。现在有一个需求,就是更新远程仓库的commit对象,那么我们看看可以如何实现这个需求。

2024-07-19 12:50:15 325

原创 Tomcat和SpringMVC交互的流程

Spring程序,实现Web交互的基础,分为2个部分,分别为tomcat和springmvc。其中springmvc实现web交互的关键点是DispatcherServlet。

2024-07-18 16:01:16 732

原创 认识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 559

原创 认识并发的三大特性—原子性、有序性、可见性

在了解并发的三大特征之前,我们需要先知道并发是什么。并发是CPU处理线程任务的一种特点。在CPU的一个核心中,可以调度多个线程在这个核心中快速交替的执行。这种交替执行的速率对于我们来说是肉眼不可见的。总的来说,并发是基于CPU的一个核心观察到的一种任务执行的特点。接着我们来了解下线程安全。线程安全是指,当有多个线程在对某个共享资源进行操作时,比如读和写的操作,这个共享资源如果依然能保持正确的状态,那么就可以说明这个共享变量是线程安全的。

2023-12-31 18:00:36 1047

原创 认识MySQL查询语句的执行顺序

在SQL中,子语句执行的顺序并不取决于它在整个SQL语句中所占据的位置。执行的顺序是基于SQL中规定的顺序来执行的。每个阶段的SQL语句所生成的结果,在SQL的底层都会被存放进虚拟表中。这张表存放的都是来自上游语句所生成的结果,它对于我们来说是不可见的,只有当整个SQL语句都执行完毕后,最后的这个结果对我们才是可见的。SQL语句的执行,就像是一个流一样,每个子语句生成的结果都会流向下一个子语句中被处理,所以子语句都是基于上游SQL语句所生成结果进行操作的。

2023-12-30 17:54:16 475

原创 Java 认识ThreadLocal是如何实现线程隔离的

Thread和ThreadLocal之间的关系如图所示。ThreadLocal实例的引用值被封装作为ThreadLocalMap.Entry中的key。在ThreadLocal类中开放了一些API,这些API通过以自身为入口,也就是以ThreadLocal实例的引用值为查询条件,来获取对应ThreadLocalMap.Entry中的value。ThreadLocal.ThreadLocalMap是用来存放数据的。

2023-12-28 10:51:26 913

原创 Java HashMap表的长度为什么是2的倍数?

这个数值串就是Y%X的计算结果。所以,正是由于二进制运算的这种特性,HashMap在put进一个新元素到哈希表时,如果哈希表的长度为2的倍数,那么就可以直接通过(n - 1) & hash得到 n%hash的结果了。由于位运算的执行效率要比%运算高效很多,所以,通过做位运算,而不是%运算,就能够大大提高对哈希表操作的效率了。

2023-08-22 17:12:37 178

原创 解析Java中String对象在JVM中的内存位置

由于字符串“+”运算的规则,对于代码String str4 = str1 + str2,由于操作数str1和str2并不是在编译期间就被确定,所以JVM就会自动把“+”替换成StringBuilder的append和toString方法。所以可以知道,str1 + str2运算实际上会为变量str4在内存堆中新建一个StringBuilder类型的对象,然后通过这个对象的toString()方法,在内存堆中再新建一个String类对象,最后让str4引用这个对象。

2023-07-09 12:55:11 1022 2

原创 Java ArrayList的扩容机制

在calculateCapacity()方法中,会先判断elementData字段是否是初始状态,是的话就会在DEFAULT_CAPACITY字段和本次添加新元素所需的最小容量之间取一个最大值。在进行一系列的计算得到本次扩容的新容量大小后,就会执行java.util.Arrays#copyOf(T[], int)方法将原elementData字段的数据copy给堆中的一个新数组对象中,且这个新数组的容量大小等于本次扩容要求的大小。这个字段是ArrayList类中定义的一个默认的初始数组大小。

2023-07-01 20:30:04 158

原创 Java的StringBuffer是如何存放数据的?

在StringBuffer类对象的内部,采用的是一个名为value,类型为char数组的数据结构来存放数据的,并且这个数组被定义在其父类AbstractStringBuilder类中。在向StringBuffer存放数据的过程中,会根据数据的不同类型采用不同的处理方式。

2023-06-22 19:04:09 180

原创 Java ArrayList实例是否可以存放NULL元素?

当add一个新元素时,如果这个元素是一个null元素,那么在这个方法中也并没有做null校验,它内部的处理逻辑就是把这个新元素直接存到elementData字段的最后一个空间中,而数组对存放null元素本身也并没有做限制。当我们调用add()方法添加一个新元素到ArrayList类中,我们看下elementData字段此时会被怎么处理。根据官方解释,可以了解到这个elementData字段就是用来存放存入到ArrayList类对象中的所有元素。

2023-06-15 17:04:40 539

原创 工厂方法模式 - 设计模式

工厂方法模式(Factory Method pattern)是一种创建型设计模式。它的主要目标是提供一种创建对象的机制:它让类的实例化延迟到子类工厂,被实例的对象将在子类工厂中被确定。

2023-06-09 13:51:01 75

原创 简单工厂模式 - 设计模式

简单工厂模式,也称为静态工厂方法模式,是一种常用的创建型设计模式。在这个模式中,这个工厂类被用来创建对象,客户端以这个类为中介得到所需的对象。这个工厂类通常有一个方法,根据客户端的需求来决定应该创建哪种产品类的实例。

2023-06-08 17:41:21 47

原创 建造者模式(Builder模式)- 设计模式

建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂的对象,并将构建对象的过程流程化。这种模式可以使产品的创建能够在同样的构建流程中创建出不同表现形式的产品,也就是不同种类的产品。这也是它的特点:将产品构建的过程公共化,构建的细节定制化,从而在这样的一套流程里构建出多个不同种类的产品。产品(Product):一个被构建的对象,其包含有多个组成。抽象建造者(Builder):根据产品的组成,定义构建产品的过程。具体建造者。

2023-06-08 16:28:54 100

原创 Optional类中,of()和ofNullable()方法的用法与区别

of(...)方法会返回一个携带被指定的value,且该value不能为NULL;使用ofNullable(...)方法时,若指定的value不为NULL,则会返回携带有该value的Optional类实例,否则就返回一个value值为NULL的Optional类实例。我们可以通过实验来看看这两者之间的区别。

2022-04-26 17:14:03 13741

原创 Optional类的作用和应用场景

我们要养成看官方文档的好习惯,所以先来看看JDK 8官方文档上的解释:从文档中可以看出来,大概的意思就是说Optional是一个基于值的类,它里面会存放一个为NULL或不为NULL的值,也就是value,然后这个类里面的API都是围绕着这个值而被开发的。

2022-04-26 16:00:24 1696

原创 探究Java ArrayList的add(E e)方法

AarrayList的add()方法每次add新元素其实都是直接把形参对应的引用地址存入到数组中。所以我们在开发的时候就要格外的认识到这一点。因为,当我们调用add方法每次都传入相同引用地址的形参时,就会导致:只要改变List中某个元素的内部内容时,就会导致数组中其它下标的元素的内容也跟着一起被改变,这是因为,此时这个数组中的每个元素,实际上指向的都是堆中同一个对象。

2022-02-25 15:51:45 2749 2

原创 探究Collections.singletonList的作用和使用方法

Collections.singletonList被限定只被分配一个内存空间,也就是只能存放一个元素的内容。这样做的好处就是不会造成内存的浪费,不像ArrayList这样的类,不管你是需要多少内存,初始化就会被分配一定空间的内存,就会导致多余内存的浪费。所以在实际的开发中,如果有特殊要求只需要List存放一个的元素,就可以使用Collections.singletonList作为数据结构来存放数据啦。

2022-02-25 14:17:28 62514 1

shoppingByAbstractFactory

采用抽象工厂的设计模式,实现顾客对不同类型超市的购物

2023-05-03

空空如也

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

TA关注的人

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