自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

欢迎来到Jimmy的博客

二流子程序员

  • 博客(141)
  • 资源 (11)
  • 收藏
  • 关注

原创 设计模式第10式:状态模式

我们遇到状态机模型,常常会理不清“状态”和“行为”的关系。状态模式就是专门解决这个应用场景的,它通过改变对象内部的状态来帮助对象控制自己的行为。状态模式允许对象在内部状态改变时改变它自身的行为,对象看起来好像修改了它的类。这个模式将状态封装成独立的类,并将动作委托给当前状态对象从用户的视角来看,如果使用的对象能否完全改变自己的行为,那么这个对象应该是从别的类实例化而来的。然而,状态模式仅通过组合不同的状态对象来造成改变类行为的假象。

2023-03-13 10:41:16 578

原创 设计模式第9式:迭代器模式

我们有很多种方法可以把对象集中到一个集合中,比如列表、堆栈、散列表中。每种集合都有自己的特点和使用时机,但都有一个共同的需求:用户想要遍历这些对象。同时我们并不想用户看到集合的实现,本文将讲解如何让用户遍历对象又无法窥视存储对象的方式。迭代器模式很好,一方面提供了统一简洁的集合遍历方式,另一方面避免暴露集合内部结构。集合遍历方式也在持续升级,后面JDK1.5又推出了“foreach”语法糖。Java8新特性:集合遍历forEach方法,我们甚至不用请求迭代器了。

2023-03-11 17:14:45 730 1

原创 MySQL8.0下载安装及root密码修改

mysql安装包可以去官网下载,但是下载速度太慢了。,搜索windows的安装包:mysql-cluster-8.0.24-winx64.zipMySQL 8.0后改密码策略已经改了,需要注意。

2023-03-01 12:09:10 527

原创 设计模式第8式:模板方法模式

模板方法相对比较简单,适用的场景也比较固定。如果一类算法(方法)中有一些步骤是固定的,另一部分步骤是变化的,那么我们可以将算法的步骤抽象成模板放在父类中,固定的步骤实现在父类中,变化的步骤设置为抽象方法由子类实现。我们在使用的时候使用子类即可。模板方法模式虽然简单,但是在Java和Spring源码中大量使用,尤其是在Spring这种类继承关系很深的框架中,使用模板方法将功能方法放在父类,变化的方法放在子类,可以有效减少重复代码。模板方法模式在父类方法中定义一个算法的骨架,而将一些步骤延迟到子类中。

2023-02-11 18:00:53 320

原创 设计模式第7式:适配器模式与外观模式

前面讲的装饰者模式是将对象包装起来,并赋予新的职责。适配器模式同样是包装对象,但是目的不一样,它要让某些对象的接口看起来不像自己而是像别的东西。为什么要这样做,因为可以将类的接口转换成想要的接口。还会讲一个适配器的变种模式:外观模式,它将对象包装起来以简化其接口。适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器模式可以让原本不兼容的类可以合作。适配器模式有很好的OO设计原则:使用对象组合。适配器模式组合对象,改变老功能行为以适配新的接口标准;

2023-02-11 17:11:18 897

原创 设计模式第6式:命令模式

命令模式关注这样一种场景:指令发布者无需关注指令是怎么执行的,只需要指定具体的执行者,具体的指令由执行者来完成。命令模式将指令发布动作和指令执行动作解耦。我在刚开始学习命令模式的时候,比较困惑它的使用场景。它不像之前讲的工厂模式,观察者模式那样有明确的使用场景。其实可以将命令模式应用在这个场景就比较好理解了:软件项目经理不可能完成所有的开发任务,他将软件开发的不同阶段设置为不同的指令,比如软件设计指令、软件开发指令、软件测试指令,然后将不同的指令指定不同的人员。

2023-02-02 17:51:43 393

原创 设计模式第5式:装饰器模式

当我们初学编程时,扩展程序功能一般习惯使用继承,使用继承有一些缺点,那就是容易造成类爆炸,并且容易继承一些不需要的特性。当我们学习完装饰器模式后,会发现善用组合会有比继承更好的效果。装饰者模式适用于这样一种场景:有一些类提供基础的功能,还有一些类要增强这些基础类的功能。于是我们将增强功能类叫做装饰者,装饰者持有一个基础类型的引用,利用组合的形式对基础类进行功能增强。

2023-01-30 21:09:34 530

原创 设计模式第4式:观察者模式&Spring事件监听机制

观察者模式是一种非常重要的设计模式,在JDK和Spring源码中使用非常广泛,而且消息队列软件如kafka、rocketmq等也应用了观察者模式。那么我们就很有必要学习一下观察者模式了。随后我们来看看大名鼎鼎的事件监听机制,它是基于观察者模式的,但是是由具体的事件来驱动系统的运行,事件监听机制在Spring源码中占有非常重要的位置。我们先从改造一个实际案例来引出观察者模式,随即又在观察者模式上进一步引出事件发布机制,接着我们又分别从源码角度深度解析了事件发布机制的原理。

2023-01-28 19:05:55 1043

原创 Java8新特性:集合遍历forEach方法

Java8给所有的集合都添加了一个新的方法forEach,该方法遍历集合中的元素并为每个元素执行指定的动作。注意,这里说的是集合的forEach方法,方法是在接口Iterable中的。而不是流Stream中的forEach方法,这两个特别容易混淆,两个方法的功能类似,但是使用场景有所区别。下面这个就是集合的Iterable接口和Map接口中的forEach方法,它有一个默认实现,子类无需实现这个方法,集合对象可以直接调用forEach方法。

2023-01-13 15:24:48 1973

原创 Java8新特性:Lambda表达式与函数式编程

Java8已经发布好久了,说是新特性其实早就不算新特性了,之前一直想补上这块内容,现在来讲讲我对Lambda表达式和函数式编程的理解。函数式编程在框架类代码中很常见,尤其是Spring源码中特别多,它的最主要作用就是简化代码,封装变化。后面我们在讲Spring源码时会再次讲到函数式编程。

2023-01-10 18:33:45 2263 1

原创 设计模式第3式:策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

2023-01-03 20:42:43 480

原创 RocketMQ详解(一):RocketMQ架构详解

MQ的三大特性:1、异步解耦上游系统对下游系统的调用如果是同步调用,则会大大降低系统的吞吐量与并发度,且系统间耦合度太高。而异步调用则会解决这些问题,一般做法就是,在两层间添加一个MQ层。2、流量削峰MQ可以将系统的超量请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求的丢失或系统被压垮。3、数据收集分布式系统会产生海量级别的数据流,比如业务日志,监控数据,用户行为等。针对这些数据流进行实时或批量采集汇总,然后对这些数据流进行大数据分析,MQ完成此类数据收集是最好的选择。

2022-08-20 18:22:50 2308 1

原创 Redis缓存详解(一):缓存数据一致性,缓存穿透、击穿、雪崩问题

我们一起来看下redis缓存的常见问题,也是常见的面试题。redis常见问题及面试题持续更新中。。。

2022-08-19 19:17:48 589

原创 SpringBoot源码深度解析(三):SpringBoot启动流程原理详解

之前我们看过Spring的启动流程,这篇文章我们一起看看SpringBoot的启动流程。SpringBoot的启动过程并不复杂,最重要的启动步骤还是Spring的容器启动过程,还有2个比较重要的步骤就是环境准备和事件监听,我们后续会讲。...

2022-08-18 17:59:44 778

原创 SpringBoot源码深度解析(二):SpringBoot外部属性绑定原理详解

我们继续分析SpringBoot的自动配置原理,这篇文章我们来分析@EnableConfigurationProperties和@ConfigurationProperties注解。探究下外部配置属性是如何被绑定到@ConfigurationProperties注解的类的属性中的。

2022-08-18 17:24:51 361

原创 Spring源码深度解析(六):Spring事务传播机制详解

上篇文章我们说过,Spring对事务的控制,是使用AOP切面实现的,我们使用时只需在方法上加上@Transactional注解,这时就有问题了。1、A方法调用了B方法,两个方法都有事务,此时如果B方法异常,那么是让B方法提交,还是两个一起回滚。2、A方法调用了B方法,但是只有A加了事务,此时是否将B也加入A的事务,如果B异常,是否回滚A。3、A方法调用了B方法,两个方法都有事务,B正常执行完,但是A异常,此时是否回滚B的数据。Spring的七种事务传播机制要根据实际场景来指定。...

2022-08-17 17:04:41 346

原创 Spring源码深度解析(六):Spring事务原理详解

Spring事务实质上是利用了AOP的原理,对于AOP的原理请参考文章Spring AOP原理及源码详解。

2022-08-16 22:15:37 359

原创 Spring源码深度解析(五):Spring AOP原理及源码详解

OOP表示面向对象编程,是一种编程思想;SpringAOP基本概念详解。类非常重要,只要Spring容器中存在这个类型的Bean,就相当于开启了AOP。类实际上就是一个后置处理器,实现了BeanPostProcessor接口。所以在某个Bean初始化。......

2022-08-16 16:41:18 453

原创 Spring源码深度解析(四):Spring框架后置处理器PostProcessor详解

为什么Spring叫做框架?–因为可以直接拿来用,可以直接构建自己的应用,Spring已经实现好了IoC容器的全部功能,拿来即用。为什么Spring能够脱颖而出并且长盛不衰?–因为Spring除了实现了IoC容器的全部功能外,还提供了大量的接口扩展点,能够轻松地扩展功能。这些接口扩展点叫做:后置处理器。.........

2022-08-13 11:13:34 835

原创 Visual Studio 2017多工程开发

前言:多工程开发的好处还需要慢慢体会。本文简单介绍vs如何多工程开发。在这之前,我们说一些基本操作:1、一个解决方案(solution)可以有1到多个工程(项目,project)。如下图所示,这也是我们本文最终实现的效果。其中,解决方案MultiPrjTest包含2个工程(Utils和UtilsTest),Utils工程生成lib库,而UtilsTest工程调用Utils生成库中的函数。右边......

2022-06-29 22:10:47 1039

原创 SpringBoot源码深度解析(二):SpringBoot环境准备及配置文件解析

SpringBoot中有一个“环境”的概念,这个环境怎么理解呢?可以将其细化为两个更细粒度的概念:profiles和properties。profile是指一个bean定义组,仅当指定的profile处于激活状态时才会向容器中注册。properties就是我们经常接触的配置(属性),配置的来源有很多,如:properties files, JVM system properties, system environment variables, JNDI, servlet context parameters

2022-06-08 18:07:05 341

原创 算法学习(10):LeetCode刷题之Dijkstra最短路径算法

前言:迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径。“图”这种数据结构的具体实现就是“邻接矩阵”或者“邻接表”。比如上面这个图,用邻接表或者邻接矩阵的存储方式如下,图中的节点一般抽象成一个数字(即下标或索引):首先,我们来确定一下Dijkstra算法的签名:// 输入一个起点和一个图(邻接矩阵表示),返回start到其他节点的最短路径,节点的值作为返回数组的下标int[] dijkstra(int start, int[][] graph)最短路径

2022-01-06 22:50:39 7709 1

原创 算法学习(9):LeetCode刷题之回溯算法

前言算法的实现依赖于深度优先搜索DFS,DFS算法尽可能深的搜索某一条路径,直到到达边界,而回溯算法在DFS算法的基础上强调了回退操作,即回溯法采用尝试的思想,分步解决问题,当发现现有的分步结果不能得到正确的结果,它将取消上一步的选择,再通过其他可能的分步继续尝试。回溯算法,其实还是一棵树的遍历过程。整个回溯过程涉及到3个方面:1、路径:即已经做出的选择。2、选择列表:即当前可以做的选择。3、结束条件:已经符合条件,无法继续选择。回溯算法通常用于求解一个问题的所有解,如排列、组合、子集等问题。算

2021-12-01 23:03:54 840

原创 算法学习(8):LeetCode刷题之dfs网格递归

前言深度优先搜索DFS算法通常出现在树结构或者图结构上,上一篇文章我们已经讲了二叉树的深度优先遍历,本文我们将二叉树的深度遍历继续引申,拓展到网格型深度优先遍历。首先我们先来统一一下网格的概念,网格是由m * n个小方格组成的网状结构,每个小方格与其上下左右4个方格都是相邻的,题目要求在这样的网格中进行某种搜索。本文借leetcode上的几个岛屿问题来讲解DFS,一般地,岛屿问题题目中每个格子中的数字是0或1。数字0代表海水,1代表陆地,相邻的陆地就连成了一个岛屿。在这个前提下,就会衍生出各种岛屿

2021-11-22 23:00:20 858

原创 算法学习(7):LeetCode刷题之二叉树递归

前言二叉树天然具有递归的特性,所以刷二叉树基本都用递归的方式。建议先刷二叉树题目,因为很多经典的算法,比如分治、回溯、动态规划等,其实都是在处理树的问题。而树的问题,基本上离不开树的递归遍历框架,这篇文章通过二叉树的问题来理解递归。/* 二叉树遍历框架 */void traverse(TreeNode root) { // 前序遍历 traverse(root.left) // 中序遍历 traverse(root.right) // 后序遍历}那么,我们

2021-11-16 23:08:29 1011

原创 算法学习(6):LeetCode刷题之并查集

前言并查集是一种巧妙的算法思想,主要解决连通性问题的场景,比如:一组对象被划分成了若干个区域,求解被划分区域的数量,或者求解如何将这几个区域连接起来。题目中往往以图形的形式来表示区域,图中节点的连通关系用一个二维数组来表示,就比如LeetCode No. 1319题,题目给出了图中节点的数量,还给出了一个二维数组,如下输入表示有4个节点,其中0和1、0和2、1和2之间有连接。输入:n = 4, connections = [[0,1],[0,2],[1,2]]我们怎么判断2个节点之间是否连通呢?我

2021-11-02 14:08:13 687

原创 算法学习(5):LeetCode刷题之滑动窗口

前言:滑动窗口算法专门优化一种场景,就是找出一个字符串(或数组)中满足一定条件的子串(或子数组)。

2021-10-18 23:21:39 387

原创 算法学习(4):LeetCode刷题之单调栈

前言栈是一种很常用的数据结构,最大的特点就是只能在一端进行操作。Java中的集合提供了一个接口Deque来表示栈结构,如下语句:Deque<Integer> stack = new ArrayDeque<>();至于为啥不用Stack类,请看下面这篇文章:Java 程序员,别用 Stack?!那么,单调栈又是什么呢?很简单,就是普通的栈加一个限定条件:栈内元素单调递增或单调递减。单调栈并不是一个Java集合中现成的容器,而是需要在编码中手动控制栈内元素的单调性。举个例子:

2021-09-30 17:26:04 256

原创 mysql学习(9):联合索引和多个单列索引的使用区别详解

前言为了提高数据库的查询效率,建索引是最常用的手段。那么问题来了,如果查询条件为2个及以上,我们是创建多个单列索引好呢,还是建一个联合索引比较好?正文我们首先来建一张表,并且指定其中的3个字段(学号、姓名、电话)为联合索引:CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stu_id` varchar(20) DEFAULT NULL COMMENT '学号', `name` varchar(30) DEFA

2021-08-19 20:17:54 4815 1

原创 mysql学习(8):索引分类详解

前言索引可以大大提高MySQL的检索速度,本文将详细讲解几种不同的索引类型,及索引常用的数据结构B-树。正文1、常见索引类型1.1 普通索引普通索引仅加速查询,CREATE INDEX index_name ON table_name(column_name);1.2 唯一索引与普通索引类似,不同的是:索引的列值必须是唯一的,但允许有空值。如果是组合索引,则列值的组合必须唯一。CREATE UNIQUE INDEX index_name ON table_name(column_name

2021-08-15 02:48:15 288

原创 算法学习(1):算法时间复杂度O(n)的通俗理解

前言如果你发明了一个算法,想知道这个算法的快慢程度,怎么办呢?上机运行一下?显然不合适。。。计算机科学家提出了“时间复杂度”这个概念。那么,该怎么理解这个“时间复杂度”概念呢?尤其是O(n)这样的符号。正文思考一下生活中的一些场景,并估计时间:1、打个哈欠 — 几秒钟2、烧一壶水 — 几分钟3、睡上一觉 — 几小时4、完成项目 — 几个月5、飞出银河系 — 几光年那么,我们常见的时间复杂度的表示O(logn)、O(n)、O(n2)也可以类比上面的时间估算,其中大O就是“几”,括号里面

2021-08-12 20:39:29 2138

原创 mysql学习(4):表连接查询

前言:SQL查询不仅可以从一张变中查询数据,还可以从多张表中同时查询数据。连接查询就是最常见的一种多表查询。连接查询是对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的记录有选择性的“连接”到主表的结果集上。正文:举个例子,我们想要选出students表中的所有学生信息,可以用一条简单的SELECT语句完成:SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;得到如下结果:上面的

2021-08-09 20:45:21 977

原创 mysql学习(3):聚合查询

前言:如果我们要统计一张表的记录的数据量,平均数等计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询。正文:1. 聚合函数常见的聚合函数有:函数说明COUNT()计算行数总量SUM()计算某一列的和值,该列必须是数值类型AVG()计算某一列的平均值,该列必须是数值类型MAX()计算某一列的最大值MIN()计算某一列的最小值举几个例子:SELECT COUNT(*) as num FROM students; #查询st

2021-08-07 18:28:57 487

原创 mysql学习(2):分页查询

前言:开发常常遇到分页查询,如果SELECT查询结果集数据量很大,可以考虑分页显示。要实现分页功能,实际上就是从结果集中显示第1-100条记录作为第一页,显示第101-200条记录作为第2页,以此类推。因此,分页实际上就是从结果集中截取第M-N条记录,这种查询可以通过LIMIT子句实现。正文:我们把一张学生表的结果集进行分页,每页3条记录。那么,要获取第一页的记录,可以使用LIMIT 3 OFFSET 0来实现:SELECT id, name, gender, scoreFROM stud

2021-08-07 16:12:01 284

原创 mysql学习(1):关系模型基本概念

前言:MySQL关系型数据库是建立在关系模型上的,而关系模型本质上就是若干个存储数据的二维表。表的每一行称为记录(Record),记录的是一个逻辑意义上的数据。表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。字段定义了数据类型(整形、浮点型、字符串、日期等),以及是够能够为NULL。这里的NULL表示字段数据并不存在,并不是指数字0或者空字符串""。正文:1、表和表之间的关系关系型数据库的表和表之间需要建立“一对一”、“一对多”、“多对多”的关系,详细介绍请参考本

2021-08-07 12:07:45 1076 4

原创 java多线程(6):线程与线程池的异常处理机制

前言java提供了一套完善的异常处理机制,异常的基础本文不展开,本文重点讲述线程的异常处理。正文本文将线程的实现分为2种,一种是实现了Runnable接口的无返回值的线程,无法在主线程感知到子线程的异常,没有被捕获的异常只会输出到控制台,那么未被捕获的异常如果没有进行处理或者日志记录,就会造成异常信息丢失;另一种是实现了Callable接口的有返回值的线程,子线程的异常信息会通过FutureTask返回值传递给主线程。最后再说一下线程池的异常处理方式。一、线程的异常处理方法1、主线程无法捕获子线程

2021-07-21 18:17:27 2115 5

原创 IDEA常用快捷键及一些便于开发的配置

目录常用快捷键1、快速换行2、快速在行尾加分号;便利的配置1、光标放在某变量上,相同变量均变底色提示,且变量最初定义处颜色不同常用快捷键1、快速换行Shift + Enter2、快速在行尾加分号;Ctrl + Shift + Enter便利的配置1、光标放在某变量上,相同变量均变底色提示,且变量最初定义处颜色不同Settings – Editor – Color Scheme – General – Code – Identifier under caret – Background 选相

2021-04-27 12:16:31 583 2

原创 算法学习(3):LeetCode刷题之优先队列(堆)

前言堆是一种很常用的数据结构,常常用于排序中,算法的时间复杂度非常的低。本文不再详细介绍堆的概念,只简单回顾一下几个比较重要的知识点,然后做几道LeetCode题目。堆就是一个完全二叉树,每个节点都大于或者小于它的子节点,相应的叫做大顶堆和小顶堆。而完全二叉树可以用数组来表示,可以使用数学公式很轻松的计算出一个节点的父节点和2个子节点,这样就有助于节点值得交换,也就为在堆中增加和删除节点时,进行相应的上浮和下沉操作。知识点一:往堆中添加元素,元素首先加到数组尾部,也就是完全二叉树的最后一个节点。然后发生

2020-09-24 00:38:16 473

原创 SpringBoot源码深度解析(一):SpringBoot的自动配置原理详解

SpringBoot流行之前,程序员大多是用SSM框架整合来进行WEB后端开发。这种方式非常麻烦,需要手动引入大量的包,还要配置很多XML文件,光是搭建环境就需要很久。随着“约定大于配置”理念的流行,SpringBoot随之兴起,它大大简化了web开发的流程,可以让初学者快速上手。SpringBoot的核心理念大致有3点:1、帮助开发者快速整合第3方框架,原理是maven依赖封装和自定义的Starter。2、完全去除XML,采用纯注解的方式。.........

2020-09-22 00:29:11 8723

原创 SpringMVC源码深度解析(二):DispatcherServlet的调度工作流程

前言SpringMVC功能强大,为我们提供了很大的便利。我们仅仅使用几个简单的注解便可以将前端发起的请求映射到普通的类及方法上(这样的方法在SpringMVC中叫做handler),这使得程序员能够将注意力放在接口的实现上,而不用关心配置太多的事。在如今前后端分离的大背景下,SpringMVC为我们提供的方便主要有2点,一个是将前端传过来的JSON绑定到POJO类上,另一个是将POJO类型转换成JSON字符串返回给前端。SpringMVC为我们提供了一个DispatcherServlet类,这个类继承

2020-09-20 01:26:13 868

mybatis逆向工程

mybatis逆向工程,逆向生成代码

2017-06-10

Neural Networks and Deep Learning-中文版

Michael Nielsen大神的巨作NNDL中文版,对深度学习基础讲解非常透彻

2017-03-21

python_beautifulSoup4.4源码包

python_beautifulSoup4.4源码包,下载解压后使用python setup.py install命令安装

2017-03-04

java_ee_api_中英文对照版.chm

java_ee_api_中英文对照版.chm,包含所有javaweb开发用到的类

2017-02-13

jdbc.jar包

下载添加到buildPath中即可

2017-01-17

DBUtils.jar_jdbc专用包

解压后,将commons-dbutils-1.4.jar添加到BuildPath中

2017-01-17

C3P0包_提供jdbc连接池

解压,将lib下的c3p0-0.9.1.2.jar添加到Build Path中即可使用

2017-01-17

sqlyog82-mysql连接工具

mysql连接工具绿色版,注册码在压缩包里面:sn.txt

2017-01-17

MySQL5安装图解

我做了一个安装图解,按着步骤一步一步来,很简单.

2017-01-17

mysql安装包

下载双击即可安装

2017-01-17

tomcat7安装包官方版下载

tomcat7安装包,下载解压即可

2017-01-17

空空如也

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

TA关注的人

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