自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java源码分析(一) -- String

String是一个引用数据类型,被final修饰,不可继承,不可改变原有字符的内容,当对原有字符进行改变操作的时候都会返回一个新的String对象,在jdk1.8中String会根据不同的创建方式会存放在堆中或字符串常量池中。

2023-10-09 16:02:11 71

原创 Java设计模式(二十)--模板方法模式

模板方法模式就是封装了一个固定的流程,流程由几个步骤组成,具体步骤由子类进行实现,每个子类具体实现的内容也不相同,从而让固定的流程产生不同的结果。

2023-04-05 10:00:00 76

原创 Java设计模式(十九)--策略模式

策略模式是定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

2023-04-05 09:00:00 75

原创 Java设计模式(十八)--状态模式

状态模式能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。状态模式很好的解决了if else之类的代码,但是当状态的数量增加时,也会导致具体状态角色的类的数量随之增加。

2023-04-04 09:00:00 47

原创 Java设计模式(十七)--观察者模式

观察者模式指多个对象存在一对多的依赖关系,当一个被观察者对象的状态发生改变时,所有依赖它的对象都得到通知并更新。

2023-04-04 08:00:00 31

原创 Java设计模式(十六)--备忘录模式

备忘录模式允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

2023-04-03 09:00:00 67

原创 Java设计模式(十五)--中介者模式

中介者模式可以将一组对象之间的交互行为封装到一个中介者对象中,从而使对象之间的交互变得松散耦合,更易于维护和扩展。

2023-04-03 08:00:00 22

原创 Java设计模式(十四)--迭代器模式

迭代器模式提供了能顺序访问集合中的元素并且不暴露其底层表示的方法,在java中有许多集合都有着迭代器。

2023-04-02 09:00:00 28

原创 Java设计模式(十三)--命令模式

命令模式是将行为请求和行为实现进行解耦,以命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理该命令的对象。

2023-04-02 08:00:00 32

原创 Java设计模式(十二)--责任链模式

责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条,请求在这个链上传递,直到链上的某一个对象决定处理此请求或多个对象一起处理此请求。

2023-04-01 09:00:00 67

原创 Java设计模式(十一)--代理模式

所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理对象,来间接的调用实际的对象。

2023-04-01 08:00:00 30

原创 Java设计模式(十)--享元模式

享元模式用于减少对象创建的数量,以及减少内存的占用并提高系统的性能,尝试复用现有的对象。

2023-03-31 09:00:00 26

原创 Java设计模式(九)--外观模式

在调用多个对象中的方法的时候,我们可以将初始化对象以及具体调用的方法抽取成一个公共的外观类,只需要去调用外观类的方法,由外观类去帮助我们初始化对象以及调用具体的方法。

2023-03-31 08:00:00 33

原创 Java设计模式(八)--装饰器模式

装饰器模式是在原有的对象的功能上进行单次或多次增强,表面上看装饰器模式与静态代理模式的区别并不大,静态代理模式只能对对象进行单次增强,并且静态代理模式的增强关系是在编译期间就已经确定了的,而装饰器模式的增强关系是在运行期间指定的。

2023-03-30 09:00:00 68

原创 Java设计模式(七)--组合模式

组合模式就是通过将单个对象和组合对象用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性。

2023-03-30 08:00:00 26

原创 Java设计模式(六)--桥接模式

桥接模式就是将多个实体中共同联系的概念进行剥离,使它们单独存在。在非桥接模式下,我们需要去关注整个与我们相关联的部分,在桥接模式下,我们只需要去关注自己。

2023-03-29 09:00:00 26

原创 Java设计模式(五)--适配器模式

适配器模式将原本不兼容的功能,使它们能够在一起工作,并得到自己需要的功能,好比如生活中电脑外接显示器的线与电脑的接口不匹配,此时就需要使用转接头来将显示器的线和电脑的接口进行适配。

2023-03-29 08:00:00 87

原创 Java设计模式(四)--原型模式

原型模式可以称作克隆模式,就是克隆一个原实例对象的副本。

2023-03-28 11:28:38 39

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

当一个复杂的对象装配时,所需要传入的参数比较多的时候,并且会根据不同的参数来装配对象,当参数不同时,装配的对象的内部也不同,可以使用过建造者模式来解决。

2023-03-28 11:07:47 28

原创 Java设计模式(二)--工厂模式

在平常开发中初始化一个实例对象的时候,如果这个实例对象初始化的时候需要一系列的流程来进行初始化,此时就造成了代码很臃肿的感觉,可以使用工厂模式来将实例对象初始化的具体流程进行封装,只需要关注所需要创建的实例对象,而不需要去关注实例对象初始化的具体流程。工厂模式主要是封装了创建产品的代码,而我们就不需要过多的去关注这个产品是如何进行创建的,我们只需要去关注我们需要哪些产品。

2023-03-27 00:22:33 34

原创 Java设计模式(一)--单例模式

设计模式是对代码中的一些问题所给出的解决方案,目的是为了让代码拥有可重复使用性、可读性、易维护性。在java代码中有很多种创建单例模式的方法,而单例模式是设计模式中最简单的一种模式。

2023-03-27 00:18:21 32

原创 Java并发系列源码分析(八)--ThreadPoolExecutor

线程池通过重用之前创建好的线程来处理任务,大大降低了线程频繁创建和销毁导致资源消耗。

2023-02-20 23:39:45 68

原创 Java并发系列源码分析(七)--LinkedBlockingQueue

LinkedBlockingQueue是一个阻塞的有界队列,底层是通过一个个的Node节点形成的链表实现的,链表队列中的头节点是一个空的`Node`节点,在多线程下操作时会使用ReentrantLock锁来保证数据的安全性,并使用ReentrantLock下的Condition对象来阻塞以及唤醒线程。

2023-02-11 01:13:38 72

原创 Java并发系列源码分析(六)--CopyOnWriteArrayList

CopyOnWriterArrayList是一个写时复制的集合,顾名思义就是在对集合中的数组元素操作的时候会将旧数组中的元素复制一份到新的数组中去,然后对新的数组进行操作,此时旧数组中的元素只能被读取,而不能进行操作,当新的数组操作完成之后会将新数组设置成当前集合中使用的数组

2023-02-08 15:36:13 97

原创 Java并发系列源码分析(五)--ConcurrentHashMap

ConcurrentHashMap是一个线程安全的集合,底层是通过对指定索引位置上的节点进行加锁,而不是对整个数组加锁,当一个线程对指定索引位置上的节点加了锁之后,其它线程就不能对该索引位置上的节点进行操作,但可以对其它的索引位置上的节点操作,有许多相似的地方,只是在一些产生线程安全的地方加了锁,如果对HashMap了解的话,再来看就简单许多。

2023-02-01 01:16:48 112

原创 Java并发系列源码分析(四)--StampedLock

ReentrantReadWriteLock是一个悲观的可重入的读写锁,而StampedLock既支持悲观锁也支持乐观锁但不支持锁的重入,在ReentrantReadWriteLock下如果多个线程同时获取读锁的时候,获取写锁的线程就会被挂起进行等待,在StampedLock乐观锁下如果有线程加了写锁,其它读线程可以获取共享变量的值。

2022-12-19 22:45:28 198

原创 Java并发系列源码分析(三)--ReentrantReadWriteLock

ReentrantReadWriteLock读写锁,顾名思义既能加读锁也能加写锁,在ReentrantLock中对一个资源加了锁就会导致其它线程不能对这个资源进行操作,如果在高并发写的操作下对资源加锁就能保证资源的正确性,但是在高并发读的操作下线程并不会更改资源的情况下,这样就会导致一个线程读取资源的时候其它读取资源的线程就需要等待这个线程执行完毕并释放锁,这样就会导致性能下降,因为多个线程读取资源的操作并不会带来线程不安全的问题,此时就可以使用ReentrantReadWriteLock读写锁,多个线程读

2022-11-29 00:18:25 131

原创 Java并发系列源码分析(二)--ReentrantLock

​ReentrantLock是一个可重入的锁,当一个线程持有锁的时候,再去调用加锁的方法则不需要发生锁竞争,因为持有锁的线程就是当前的线程,此时只需要修改线程加锁次数即可,在ReentrantLock中锁的类型分为非公平锁和公平锁,默认创建的锁为非公平锁,非公平锁不管等待队列中是否有线程在等待加锁都会尝试获取锁,而不是先进入等待队列中,公平锁则是会先进入到等待队列中,等待前面的线程加完锁并释放锁之后才会获取锁。

2022-11-22 19:54:50 110

原创 Java并发系列源码分析(一)--Atomic

在多线程或高并发的环境中,对数值进行++或–操作时就会导致预期的值与实际的值不相同,我们可以通过使用加锁的操作来对数值进行++或–的操作,这样就可以保证预期的值与实际的值相同,但是使用就会使性能下降,此时就可以使用Atomic原子类对数值进行操作。

2022-11-13 22:18:56 225

原创 Java集合系列源码分析(七)--TreeMap

TreeMap是一个有序的集合,默认顺序从小到大,也可以根据自定义的顺序传入一个Comparator比较器进行排序,TreeMap底层使用的是红黑树,TreeMap不允许使用null作为key,但可以使用null作为value。

2022-10-15 00:56:30 373

原创 Java集合系列源码分析(六)--LinkedHashSet

LinkedHashSet继承了HashSet,在HashSet中有一个私有的构造方法用来创建LinkedHashMap,LinkedHashSet底层使用的则是LinkedHashMap,LinkedHashSet与HashSet并没有多大的区别,只是LinkedHashSet能使用双向链表保存元素插入顺序或元素访问顺序。

2022-10-05 11:30:45 304

原创 Java集合系列源码分析(五)--HashSet

HashSet底层是基于HashMap来实现的,是不允许有重复的元素的,如果添加相同的元素则会替换value,HashSet插入顺序是无序的,如果熟悉HashMap的代码再来看HashSet的代码则会很简单。

2022-10-05 11:09:37 169

原创 Java集合系列源码分析(四)--LinkedHashMap

LinkedHashMap继承自HashMap,LinkedHashMap中的多种操作都是基于HashMap的,跟HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了Entry的插入顺序和访问顺序。

2022-10-04 23:18:44 779

原创 Java集合系列源码分析(三)--HashMap

HashMap以key-value的存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,key只能存在一个null,而value可以存在多个,此外,HashMap 中的映射不是有序的。jdk1.8以后HashMap底层的数据结构为数组+链表+红黑树,当数组中的数据存在hash冲突的时候则会将数组转换为链表,当链表的长度大于等于8的时候不会直接转换为红黑树

2022-10-04 12:29:58 146

原创 Java集合系列源码分析(二)--LinkedList

LinkedList基于双向链表来实现的,每个节点中都拥有上一个节点和下一个节点所在的指针位置,通过上一个节点和下一个节点的指针位置则能遍历双向链表,在对双向链表进行操作的时候只需要将操作的节点相关联的指针修改即可。LinkedList实现了Dueue接口,将LinkedList看成是一个双端队列,双端队列只能对头节点和尾节点操作。LinkedList与ArrayList不同,LinkedList不需要提前申请一大片连续的内存空间来存放数据,只要内存中任何地方存在剩余空间都可以存放数据

2022-10-03 16:13:58 138

原创 Java集合系列源码分析(一)--ArrayList

ArrayList继承于AbstractList,实现了List接口,是一个长度可变的集合,提供了增删改查的功能。ArrayList实现了RandomAccess接口,可以对元素进行快速访问。ArrayList实现了Serializable接口,可以对ArrayList进行序列化。ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。ArrayList底层是通过数组来实现的,当向数组中添加元素时,数组的容量大小不足则会扩容。

2022-10-01 23:40:49 166

空空如也

空空如也

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

TA关注的人

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