自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 资源 (3)
  • 收藏
  • 关注

原创 Java 列表转树状结构 list to tree

利用 stream 实现 List 转树状结构

2022-10-12 18:02:43 3230

原创 JVM学习第八节 对象的实例化、内存布局与访问定位

Java 对象的实例化、内存布局与访问定位

2022-08-28 09:17:26 338

原创 JVM学习第七节 方法区

方法区概述运行时数据区结构图以线程是否共享的角度分析栈、堆、方法区的交互关系方法区的理解概述运行时数据区结构图    以线程是否共享的角度分析    啊栈、堆、方法区的交互关系    方法区的理解    《Java虚拟机规范》说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但是对于HotSpot JVM而言,方法区还有一个别名(Non-heap)非堆,目的就是要和堆分开。所以方法区看作是一块独立于Java堆的内存空间。  

2022-08-26 11:28:05 236

原创 JVM学习第六节 堆 Heap

堆 Heap堆 (Heap)概述基本概念内存细分三级目录堆 (Heap)概述基本概念    1、一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。    2、Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存大小是可调节的。    3、Java虚拟机规范中规定,堆可以处于物理上不连续的内存空间中,但是在逻辑上它应该被视为连续的。    4、所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local All

2022-07-18 14:18:18 387

原创 JVM学习第四节 虚拟机栈

虚拟机栈虚拟机栈概述栈的存储单位局部变量表操作数栈代码追踪栈顶缓存技术动态链接方法的调用 :解析与分派方法返回地址一些附加信息虚拟机栈概述虚拟机栈出现的背景    由于跨平台性的设计,Java的指令都是基于栈设计的,不同平台的CPU架构不同,所以无法基于寄存器设计。基于栈的指令集优缺点    优点是可移植性(跨平台)更好、栈指令集的代码更加紧凑(字节码中每个字节就对应一条指令,但是多地址指令集中还需要存放参数)指令集小、编译器实现比较简单(不需要考虑空间分配的问题,所需空间都在栈上操作)。  

2022-03-21 11:21:40 1424 1

原创 JVM 学习第三节 运行时数据区概述与PC寄存器

运行时数据区概述及线程运行时数据区简图运行时数据区    内存的概念    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行,JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略、保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异,结合JVM虚拟机规范,探讨一下经典的JVM内存布局(针对 HotSpot VM)。简图    Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机

2022-02-17 14:11:28 330

原创 JVM学习第二节类加载器子系统

类加载器子系统内存结构概述简图比较详细的内存结构图类的加载器与泪的加载过程概述内存结构概述简图比较详细的内存结构图类的加载器与泪的加载过程概述    类加载器子系统负责从文件或者网络中加载class文件,class文件在文件开头有特定的文件标识。    ClassLoader只负责class文件的加载,至于它是否可以运行,则有Execution Engine决定。    加载的类信息存放于一块称为方法区的内存文件,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量

2022-02-08 14:56:06 392

原创 JVM学习第一节 JVM与Java体系结构

JVM与Java体系结构虚拟机与Java虚拟机介绍虚拟机Java虚拟机JVM的位置虚拟机与Java虚拟机介绍虚拟机虚拟机(Virtual Machine) 就是虚拟的计算机,本质是软件,用来执行一系列虚拟计算机指令。大体上虚拟计算机可以分为系统虚拟机和程序虚拟机。Virtual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为J

2021-12-02 16:30:06 369

原创 获得线程的方式的第三种方式 Callable

Callable接口获得线程继承Thread类和Runnable接口方式实现Callable接口方式FutureTask类源码简介继承Thread类和Runnable接口方式    有两种创建线程的方法-一种是通过创建Thread类,另一种是通过使用Runnable创建线程。 public class MyThread implements Runnable { // 实现 Runnable 接口方式 @Override public void run() {

2021-03-16 16:00:33 306

原创 Java 集合框架(List/Set/Map)的线程安全问题

Java 集合框架的线程安全问题List线程安全问题Set线程不安全Map线程安全问题List线程安全问题    1、先来一段代码 @Test public void test() { List<Integer> ints = Arrays.asList(1, 2, 3, 4); ints.forEach(System.out::println); }    上述代码是不存在线程安全问题的,但是在多线程环境中,List下的Array

2021-03-08 11:12:49 516 2

原创 Java 深入理解synchronized锁

深入理解synchronized锁synchronized的特性synchronized的案例synchronized简单解释synchronized的特性    1、原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。    2、可见性:可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。    3、有序性:有序性值程序执行的顺序按照代码先后执行。    4、可重入性:当一个线程试图操作一个由其他线程持有的对象锁

2021-03-07 10:31:04 152 1

原创 Java 多线程之间的通信

多线程间的通信需求synchronized 实现JUC Lock 实现多线程指定调用顺序需求    一般情况下,一个线程只负责自己的任务,执行完成之后就结束了,但是在多线程中,一个线程的处理有可能会依赖另一个线程的数据,所以是需要线程之间的通信,达到信息同步的目的。    举个栗子:多个线程去操作初始值为0的一个变量,实现一个线程对该变量 +1 另一个线程对该变量 -1,交替打印。    在多线程的编程中,参照:在高内聚低耦合的前提下,线程->操作->资源类的结构去做,这样逻辑清晰一点。

2021-03-06 10:44:12 235

原创 数据结构和算法学习第八节 排序算法 三 插入排序与希尔排序

插入排序与希尔排序插入排序概述思路分析代码实现希尔排序概述思路分析代码实现插入排序概述    插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。    插入排序基本思路    插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插

2021-01-26 20:20:25 197

原创 数据结构和算法学习第七节 排序算法 二 冒泡与排序选择排序

冒泡与排序选择排序冒泡排序概述冒泡排序思路分析代码实现选择排序概述思路分析代码实现冒泡排序概述    冒泡排序(Bubble Sort):是一种较简单的排序算法。通过对需要排序的序列,从前到后(从下标较小的元素开始),一次比较相邻元素的值,如果发现逆序则进行交换,比如升序排序:使较大的元素逐渐向后排序。    也可以进行优化->因为排序的过程中,各个元素不断的接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列是有序的,因此要在排序过程中设置一个标志(比如flag)判断元素是否进行过交换

2021-01-25 16:51:35 139

原创 数据结构和算法学习第六节 排序算法 一 基本概念

算法的时间复杂度概述算法的时间复杂度概述    排序算法:是将一组数据,按照指定的顺序进行排列的过程。    排序的分类:    1、内部排序:将需要处理的所有数据加载到内存储存器中排序    2、外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。    常见的排序算法分类如下所示,外部排序先略过。#mermaid-svg-q0D3Hnei9tku3MNp .label{font-family:'trebuchet ms', verdana, arial;font-fami

2021-01-25 10:33:14 148

原创 数据结构和算法学习第五节 递归

递归概述应用案例概述    简要的说:递归就是自己调用自己,每次调用是传入不同的变量。递归有助于解决复杂问题,同时让代码变得简洁。    简单的使用案例public class Test { // 举例1 public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n= " + n); }

2021-01-22 19:36:56 191 4

原创 数据结构和算法学习第四节 栈的应用与扩展 波兰表达式

栈的应用与扩展前缀、中缀、后缀表达式前缀表达式中缀表达式后缀表达式逆波兰计算器(后缀表达式计算)中缀表达式转后缀表达式前缀、中缀、后缀表达式前缀表达式    前缀表达式:也称为波兰表达式,前缀表达式的运算符位于操作数之前,例如(3+4)×5-6对应的前缀表达式就是 - × + 3 4 5 6。 (3+4)×5-6是中缀表达式    前缀表达式的计算机求值过程    从右至左扫描表达式,遇到数字时,将数字压入到数栈,遇到运算符时,弹出栈顶的两个数(栈顶元素和次栈顶元素),并使用运算符进行相应的计算,

2021-01-21 14:10:40 156

原创 数据结构和算法学习第三节 栈

栈概述栈的代码实现(使用数组实现)案例概述    1、栈(stack)是一个先入后出的有序列表    2、栈(stack)限制线性表中元素的插入和删除,只能在线性表的同一端进行操作的一种特殊线性表,允许插入和删除的一端是变化的一端,称为栈顶(Top),另一端是固定的一端称为栈底(Bottom);    3、新增元素:最先放入栈的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。    入栈示意图    元素出栈示意图    应用场景简要介

2021-01-20 19:29:58 138 1

原创 数据结构和算法学习第二节 链表

链表单链表单链表概述单链表实现单链表案例单向链表解决约瑟夫问题双向链表概述单链表单链表概述    基本介绍    链表示有序的,但是存储的地址不一定示连续的,存储示意如图下:    简要说明,head头指针指向的是 data域a1,a1的next域指向下一个存储的节点,链表存储的数据并不一定是连续的。    1、链表是以节点的方式存储的    2、每个节点包含data域(存储数据)、next域指向的下一个存储的节点    3、链表的各个节点不一定是连续存放的    4、链表可以有头节点,

2021-01-18 15:09:40 292 1

原创 数据结构和算法学习第一节 稀疏数组与队列

稀疏数组前言稀疏数组稀疏数组案例队列前言    数据结构和算法的在程序开发中是十分重要的,算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算。    数据结构和算法的关系    1、数据结构是一门研究组织数据方式的学科,有了编程语言也就有了数据结构,学好数据结构可以写出更加有效率的代码。    2、程序=数据结构+算法。    3、数据结构是算法的基础,学算法之前必须要有扎实的数据结构知识。    数据结构的分类    数据结构包括线性结构和非线性结构。    1、线程结构

2021-01-12 11:33:49 153 1

原创 设计模式学习第二十三节 职责链模式

职责链模式概述案例总结概述    基本介绍    1、职责链模式Chain of Responsibility Pattern,也叫做责任链模式,为请求创建了一个接收者对象的链,责任链模式对请求的发送者和接收这进行解耦。这种模式属于行为型模式。    2、职责连模式通常每个接收者对象都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么他会把相同的请求传给下一个接收者。以此类推。    3、在一个软件系统中,可以处理某个请求的对象不止一个,例如学校OA系统中,教学办公用品的采购,教学主任、副

2021-01-08 16:34:13 114

原创 设计模式学习第二十二节 策略模式

策略模式概述案例应用分析题外话 Arrays.asList()方法不能add的小坑总结概述    策略模式(Strategy Pattern)基本介绍    1、在策略模式中,定义算法族,分别封装起来。让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。是一种行为型模式。    2、策略模式体现了几个设计原则:第一、把变化的代码从不变的代码中分离出来;第二、针对接口变成而不是具体的类(定义了策略接口);第三、多用组合/聚合,少用继承(客户端通过组合方式使用策略模式)。    3、在策

2021-01-08 10:44:10 121

原创 设计模式学习第二十一节 状态模式

状态模式概述案例总结概述    基本介绍    1、状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同行为的问题。状态和行为是一一对应的,状态之间可以相互转换。    2、当一个对象的内部状态发送变化时,允许改变其行为,对象看起来似乎修改了它的类。状态模式是行为型模式。    3、状态模式用于解决系统中复杂对象的状态转换,以及不同状态下行为的封装问题,当系统中的某个对象存在很多状态,这些状态之间可以进行转换,而且对象在不同状态下的拥有不同的行为。状态模式将

2021-01-07 16:31:53 113

原创 设计模式学习第二十节 解释器模式

解释器模式概述案例总结概述    基本介绍    1、解释器模式(Interpreter Pattern):定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的语言是指使用规定的格式和语法的代码。解释器模式是一种行为型模式。    2、解释器模式用于描述如何使用面向对象语言构成一个简单的语言解释器,在某些特定的情况下,为了更好的描述一类特定类型的问题,比如正则表达式,可以创建一种新的语言,这种语言拥有自己的表达式结构,也就是语法规则,使用解释器模式来设计这种新的语言,解释器模式是一种使

2021-01-06 15:58:07 197 1

原创 设计模式学习第十九节 备忘录模式

备忘录模式概述案例实现总结概述    基本介绍    1、备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复带原先保存的状态。备忘录模式属于行为型模式。    2、备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便的回退到一个特点的历史步骤,当新的状态无效或者存在问题时,可以使用暂存起来的备忘录将其恢复。    3、备忘录对象主要用来记录一个对象的某种状态,或者默写数据,可以从备忘录对象中获取原来

2021-01-05 16:23:48 198

原创 设计模式学习第十八节 中介者模式

中介者模式概述中介者模式应用案例总结概述    基本介绍    1、中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示的相互引用,从而使其耦合度降低,而且可以独立的改变它们直接的交互,使代码易于维护。属于行为型模式。    2、对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。    3、比如MVC模式,C(controller控制器)是M(

2021-01-05 10:11:43 164

原创 设计模式学习第十七节 观察者模式

观察者模式概述实例分析与代码实现概述    观察者模式简要介绍    1、当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。    2、定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。    3、一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。    4、一个对象(目标对象)的状态发生改变,所有的依赖对

2021-01-04 11:11:13 99

原创 设计模式学习第十六节 迭代器模式

迭代器模式概述迭代器简单实现注意细节概述    1、迭代器模式主要是用于容器与容器的遍历,属于行为型模式。    2、如果我们的集合元素使用不同的方式实现的,例如数组、Java集合类或者其它方式实现,当客户端需要遍历集合元素的时候,可能会需要多种遍历方式、而且还有可能暴露元素的内部结构,需要避免这些问题,可以考虑使用迭代器模式。    3、迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素。不需要知道集合对象的底层表示,也就是不需要暴露内部的结构。    类图简要示意    

2021-01-03 16:41:03 153 2

原创 设计模式学习第十五节 访问者模式

访问者模式概述代码实现使用细节概述    基本介绍    1、访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各个元素的操作,它可以在不该拜年数据结构的前提下定义作用于这些元素的新的操作。    2、主要将数据结构于数据操作分离,解决数据结构和操作耦合的问题。    3、访问者模式的基本工作原理是:在被访问类的里面添加一个对外提供接待访问者的接口。    4、访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有什么关联),同时需要避免这

2020-12-31 11:35:49 171

原创 设计模式学习第十四节 命令模式

命令模式概述举例实现命令模式优缺点分析概述    基本介绍    1、命令模式(Command Pattern):“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式,也叫做Action/Transaction    2、在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接

2020-12-29 19:48:33 127

原创 设计模式学习第十三节 模版方法模式

模版方法模式概述代码实现模板方法模式钩子方法模版方法在Spring框架中的应用分析模版方法模式注意事项与细节概述    基本介绍    模版方法模式(Template Method Pattern),也叫做模版模式,在一个抽象类公开定义了执行它的方法的模版,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单来说,模版方法模式就是定义一个操作中的算法(流程)的骨架,而将一些具体实现的步骤延迟到子类中实现,使得子类可以不改变算法的结构,就可以定义该算法的某些特定步骤。这种类型的设计模式

2020-12-29 11:46:47 115

原创 设计模式学习第十二节 代理模式

代理模式基本介绍静态代理动态代理Cglib代理扩展基本介绍    1、代理(Proxy)模式:为对象提供一个替身,以控制这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。    2、被代理的对象可以是远程对象,创建开销大的对象,或者需要安全控制的对象。    3、代理模式有不同的形式,主要有三种:静态代理、动态代理(接口代理,JDK代理)和Cglib代理(可以在内存中动态的创建对象而不需要实现接口,它是属于动态代理的一个

2020-12-28 16:12:36 533 1

原创 设计模式学习第十一节 享元模式

享元模式例题与需求概述简单享元模式例题与需求    例题 public static void main(String[] args) { String a = "zxc"; String b = "zxc"; String c = new String("zxc"); System.out.println(a == b); // true System.out.println(a == c); // false

2020-12-26 16:34:23 141

原创 设计模式学习第十节 外观模式

外观、门面、调停者需求概述代码实现总结需求    组建一个家庭影院    设备有:播放器、投影仪、屏幕、音响、灯光设备等等,若需要完成家庭影院的功能,它的过程大致为:找到各种遥控器,统筹设备开关、放下屏幕、打开投影仪、打开音响、打开播放器、调节灯光、播放、结束后关闭各种设备。    最直接的方式解决方案的类图大致描述如下    Client直接使用各个子系统的示意代码如下 @Test public void test(){ // 1、创建各种相关对象 /

2020-12-24 16:24:49 119

原创 设计模式学习第九节 组合模式

组合模式需求概述代码实现注意事项和细节需求    先整理一个需求,展示一个学校的院系组成,一个学校有多个学院,一个学院又有多个系。如何描述它们之间的关系?一种方案是将学院作为学校的子类,系作为学院的子类,类图描述如下:#mermaid-svg-hzXx72mZxEqF0eqz .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mer

2020-12-23 16:22:48 167

原创 设计模式学习第八节 装饰者模式

装饰者模式需求装饰者模式简介代码实现需求    咖啡订单需求    1、咖啡种类/单品咖啡:Decaf(无因咖啡) LongBlack(美式咖啡)等等。    2、可添加调料:Milk、Chocolate 等等。    3、要求在扩展新的咖啡种类或者调料时,具有良好的扩展性、可维护性。    4、使用面向对象的方式来计算不同种类咖啡的费用,客户可以点单品咖啡、也可以任意添加调料。    解决方案 如果组合出每种类可能类型的咖啡太过庞大 自己的思路#mermaid-svg-Kh4nxVgqx

2020-12-22 20:11:31 107

原创 设计模式学习第七节 桥接模式

桥接模式基本介绍桥接模式代码示例基本介绍    桥接模式(Bridge)是指:将实现与抽象放在两个不同的层次中,使两个层次可以独立改变。是一种结构型设计模式。Bridge模式是基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同的类承担不同的职责,它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各个部分的独立性以及对应他们的功能扩展。    原理简要类图#mermaid-svg-8pPHrvrqMWGnf8N2 .label{fon

2020-12-21 20:15:00 132

原创 设计模式学习第六节 适配器模式

适配器模式 Adapter基本介绍类适配器模式对象适配器模式接口适配器模式基本介绍    1、适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类协同工作。其别名为包装器(Wrapper)。    2、适配器模式属于结构性模式,主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。    工作原理简介    1)将一个类的接口转换成另一个接口,让原本接口不兼容的类可以兼容。    2)从用户的角度看不到被适配者,是解耦的。  

2020-12-18 14:51:15 118

原创 设计模式学习第五节 建造者模式

建造者模式new复杂对象问题建造者模式new复杂对象问题    需求: 新建汽车对象,至少包含 大小、轮胎、装饰、发动机等等详细属性。最先想到的方式是直接new出对象。    代码实现package com.example.pattern.builder;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/** * @author zjt * @date 2020-1

2020-12-15 11:46:22 145 1

原创 设计模式学习第四节 原型模式

原型模式三级目录三级目录

2020-12-10 14:20:20 121

临时内网映射小工具(仅用于Windows 64 位系统测试)

在项目开发过程中,可将本地localhost的8080端口临时映射为可访问的http://*****.****.com路径,但仅用于测试,原因提供服务的时长不稳定,容易断开映射,需要重启才能使用

2019-03-11

Java_1.8_API文档,中文版本

中文版本java_1.8_API,查询常用且权威的使用方法 , 帮助查询Java8新特性。仅供学习交流呦。

2018-12-19

学生版本Xshell和Xftp

xshell和xftp的套装,远程连接服务器的好帮手,下载后可以直接安装。

2018-11-13

空空如也

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

TA关注的人

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