自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(251)
  • 资源 (1)
  • 收藏
  • 关注

原创 MySQL中EXISTS和IN的区别和选择

假如现在有这样的两张表:CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT NULL,PRIMARY KEY (`emp_no`));CREATE TABLE

2020-11-18 10:50:44 481

原创 Mycat基本使用

MycatMycat属于数据库中间件,用于连接Java应用程序和MySQL数据库。主要作用如下:读写分离数据分片垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)多数据源整合原理Mycat原理主要是拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。安装Mycat官网:http://www.mycat.org.cn/我这里选

2020-11-17 16:23:53 997

原创 Java-JSR303 注解使用(普通校验、分组校验、自定义校验)

校验注解(1)给Bean的属性添加注解:javax.validation.constraints.xxx(2)在Controller方法参数上加注解:@Valid@TableName("brand")public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; // 品牌id @Null(message = "新增不能指定id") @TableId

2020-10-10 15:26:14 1234 2

原创 显示三级列表-数据库设计和查询方法

数据库表设计:CREATE TABLE `pms_category` ( `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id', `name` char(50) DEFAULT NULL COMMENT '分类名称', `parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id', `cat_level` int(11) DEFAULT NULL COMMENT '层级', `s

2020-10-05 17:03:26 1608

原创 Listener之实现网站在线人数统计

Java web三大核心组件之一Listener用来监听其他对象的状态改变然后触发相应的事件,三个被监听的域对象:ServletContext、HttpServletRequest、HttpSessionServletContextListener监听器中提供两个方法:public interface ServletContextListener extends EventListener { // 容器初始化的时候执行一次 default void contextInitialized(

2020-08-18 22:34:05 1280

原创 SpringMVC的注解配置原理

META-INF\services\javax.servlet.ServletContainerInitializerweb容器启动的时候,会扫描每个jar包中META-INF\services\javax.servlet.ServletContainerInitializer文件, 加载其中指定的ServletContainerInitializer的实现类,并调用onStartup方法。@HandlesTypes(value = {HelloServlet.class})用于指定一个接口,所有该接口的

2020-05-28 21:25:32 588

原创 JUC——ReentrantLock源码简读(中)

前言《JUC——ReentrantLock源码简读(上)》提到会在这篇讨论hasQueuedPredecessors() 方法,为了方便看,再来贴下源码和上篇写的注释:package java.util.concurrent.locks;public class ReentrantLock implements Lock, java.io.Serializable { // ....忽略很多源码 /** * Sync object for fair locks */

2020-05-21 12:44:55 234

原创 JUC——ReentrantLock源码简读(上)

先简单说下ReentrantLock的起源最开始Java自带Synchronized关键字保证并发安全,但是它最大的缺点就是它是个重量级锁,线程唤醒和挂起会进行系统调用,触发用户态和内核态的转换,主要是这个过程很耗费资源和性能。基于这个问题,ReentrantLock出现了,在JDK层面上解决线程安全问题。并发模式有两种:交替执行和并发执行。在JDK1.6之前,即使是交替执行模式,Synchronized的做法也是当一个线程来了,就要加锁,执行完了,就要释放锁。而ReentrantLock的做法是,使

2020-05-21 11:36:08 298

原创 Spring源码——AOP

文章目录准备分析@EnableAspectJAutoProxy创建MathCalculator的代理对象-前期流程创建MathCalculator的代理对象-中期流程(执行后置处理器)创建MathCalculator的代理对象-后期流程(开始创建)用代理对象执行目标方法拦截器链chainCglibMethodInvocation.proceed()执行拦截器链准备public class MathCalculator { public int div(int i, int j) {

2020-05-15 12:34:38 320

原创 Spring源码——容器创建

Spring5.0.2准备public class Blue { public Blue() { System.out.println("Blue---Constructor"); }}@ComponentScan("cn.example.ext")@Configurationpublic class ExtConfig { @Bean public Blue blue() { return new Blue(); }.

2020-05-14 20:38:33 270

原创 RabbitMQ死信队列详解和使用

死信队列死信,在官网中对应的单词为“Dead Letter”“死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况:消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为false。消息在队列的存活时间超过设置的TTL时间。消息队列的消息数量已经超过最大队列长度。那么该消息将成为“死信”。“死信”消息会被RabbitMQ进行特殊处理,如果配置了死信队列信息,那么该消息将

2020-05-09 20:01:53 1147 1

转载 RabbitMQ之消息确认机制(事务、Confirm)

概述在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达broker代理服务器呢?如果不进行特殊配置的话,默认情况下发布操作是不会返回任何信息给生产者的,也就是默认情况下我们的生产者是不知道消息有没有正确到达broker的,如果在消息到达broker之前已经丢失的话,持久化操作也解决不了这个问题,因为消息根本就没到达代理服务器,你怎么进行持久化,那么这个问题该怎么解决呢?

2020-05-09 16:18:59 295

原创 JVM 垃圾回收

如何判断垃圾引用计数给对象设置一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1。但是循环引用的对象没法回收。Java中没有采用这种方式。可达性分析哪些对象可以作为根对象?JVM中的根对象分为这几类:【System Class】启动类加载器加载的类对象,如Object、System、String等核心类对象【Native Class】本地方法栈,JVM运行的时候会调用系...

2020-04-11 14:30:53 324

原创 常量池、运行时常量池、字符串常量池

文章目录常量池运行时常量池字符串常量池(StringTable)第一个例子第二个例子JDK8常量池存在于字节码文件中二进制字节码中有:类基本信息、常量池、类方法定义(其中包含虚拟机指令)常量池用于存放编译期生成的各种字面量和符号引用字面量:字面量类似与我们平常说的常量,主要包括:文本字符串:就是我们在代码中能够看到的字符串,例如String a = “aa”。其中”aa”...

2020-04-04 21:41:53 1013

原创 synchronized原理详解

文章目录synchronized关键字保证并发三大特性synchronized的两个特性可重入特性不可中断特性synchronized原理monitor监视器锁monitor竞争monitor等待monitor释放monitor是重量级锁JDK6开始对synchronized的优化CASCAS原理CAS适用场景synchronized锁升级过程偏向锁轻量级锁synchronized小结synchr...

2020-04-02 13:54:47 503

原创 Java内存模型(JMM)

Java内存模型概念Java内存模型(Java Memory Mode,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下能够达到一致的内存访问效果。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。Java内存模型和CPU缓存模型类似,是基于CPU缓存模型来建立的,CPU缓存模型如下图,...

2020-03-30 23:49:15 295

原创 BIO、NIO、Netty

IO与NIOIONIO面向流(Stream Oriented)面向缓冲区(Buffer Oriented)单线传输双向传输阻塞IO(Blocking IO)非阻塞IO(Non Blocking IO)–选择器(Selectors)传统IO中,“流”就是一个用于数据传输的管道,是一个单向管道,即读取加载磁盘\网络数据时,需要建立一个输入流,将数据...

2020-03-27 21:08:22 391

原创 可重入锁和不可重入锁

锁锁就是把代码块、资源或数据(称为临界资源)锁上,访问临界资源的时候只允许一个线程去操作,其他线程必须等待或者放弃,这是为了保证最终程序的正确运行。不可重入锁public class Lock { private boolean isLocked = false; // 标识锁是否被线程获得 public synchronized void lock() throws In...

2020-03-15 23:40:22 210

原创 Java中的Serializable接口

SerializableSerializable接口的定义:public interface Serializable {}该接口没有任何属性和方法,这样的接口称为标识接口。标识接口:只是起标识作用,而不解决实际问题,实际问题交给其他机制处理。如上课的时候,学生举手问老师问题,老师帮他解答,其实学生举手就是一个标识,说明自己无法解决某个问题,请求帮助。Java中的Serializabl...

2020-03-15 22:05:43 668

原创 字符串匹配算法(BF、RK、KMP)

字符串匹配问题描述:给定主串str1,模式串str2,在str1找查找str2子串第一次出现的位置,如果存再,则返回str2在str1中第一次的下标,否则返回-1。BF算法全称Brute Force算法,即暴力匹配算法。在主串中,检查起始位置分别是0、1、2…n-m且长度为m的n-m+1个子串,看有没有跟模式串匹配的。/** * @param str1 主串 * @param st...

2020-03-15 10:35:58 601

原创 Java 遍历集合时删除元素 快速失败和安全失败

遍历集合时删除元素的五种操作import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class Test { public static void main(String[] args) { List<String> list = new Arr...

2020-03-14 11:31:44 979 1

原创 Comparable接口和Comparator接口的使用和区别

ComparableComparable接口在JDK8中的源码:package java.lang;import java.util.*;package java.lang;public interface Comparable<T> { public int compareTo(T o);}用法:public class User implements C...

2020-03-09 11:30:29 32105 3

原创 树---B树、B+树、B*树

B树B树(也称B-tree,B-树)特点:B树的阶:节点的最多子节点个数B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的子结点;重复,直到所对应的子指针为空,或已经是叶子结点关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据搜索有可能在非叶子结点结束其搜索性能等价于在关键字全集内做一次二分查找B+树B...

2020-03-04 16:03:15 407

原创 树---赫夫曼树

赫夫曼树几个概念:路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。树的带权路径长度:树的带权...

2020-02-22 09:21:19 206

原创 树---二叉树、顺序存储二叉树、线索化二叉树、二叉搜索树(BST)、平衡二叉树(AVL)

树树形结构:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;关于树形结构中的一些术语:节点的高度=节点到叶子节点的最长路径(边数)节点的深度=根节点到这个节点所经历的边的个数节点的层数=节点的深度+1树的高度=根节点的高度二叉树每个节点最多有两个子节点满二叉树:一棵二叉树...

2020-02-20 17:11:08 921

原创 查找---二分查找的三种实现和插值查找

二分查找递归实现区间为左闭右闭区间为左闭右开public class BinarySearchTest { public static void main(String[] args) { int[] arr = {1,2,3,4,5}; int index1 = binarySearch1(arr, 5); System.out...

2020-02-18 22:19:24 251

原创 MyBatis使用总结

1. MyBatis环境搭建导入jar包坐标:<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4....

2020-02-17 23:58:32 299

原创 排序算法实现和性能分析

排序算法冒泡排序选择排序插入排序希尔排序快速排序归并排序基数排序性能排序算法最好时间复杂度最坏时间复杂度平均时间复杂度空间复杂度稳定性冒泡排序O(n)O(n^ 2)O(n^2)O(1)稳定选择排序O(n^ 2)O(n^ 2)O(n^2)O(1)不稳定插入排序O(n)O(n^ 2)O(n^2)O(1)稳定希...

2020-02-16 15:39:21 452

原创 排序---基数排序实现和性能分析

基数排序算法思想将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。图解将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序事先准备10个数组(10个桶), 0...

2020-02-16 12:41:54 434

原创 排序---希尔排序实现和性能分析

希尔排序希尔排序是简单插入排序的改进,直接插入排序的最坏情况时间复杂度达到O(n^2),比如从大到小的一串数字654321,使用插入排序从小到大进行排序,这就达到插入排序的最坏情况。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。示意图(1)对下面这组数据进行从小到大排序(n...

2020-02-15 19:51:37 720

原创 排序---插入排序实现和性能分析

插入排序public class InsertSort { public static void main(String[] args) { int[] arr = new int[10]; Random random = new Random(); for(int i = 0; i < 10; i++) { ...

2020-02-14 22:35:40 284

原创 排序---选择排序实现和性能分析

选择排序public class SelectSort { public static void main(String[] args) { int[] arr = new int[10]; Random random = new Random(); for(int i = 0; i < 10; i++) { ...

2020-02-14 22:10:38 332

原创 设计模式---代理模式

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

2020-02-14 09:53:05 145

原创 Git、GitHub、Idea+Git使用总结

git-2.16.2简介Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是分布式版本控制系统,SVN是集中式版本控制系统。布式的版本控制就是每个人都可以创建一个独立的代码仓库用于管理,各种版本控制的操作都可以在本地完成。每个人修改的代码都可以推送合并到另外一个代码仓库中。而SVN只有一个中央控制,所有的开发人员都必须依赖于这个代码仓库。每次版...

2020-02-13 00:00:07 239

原创 设计模式---外观模式

外观模式外观模式也叫过程模式,外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一字系统更加容易使用外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需要跟这个接口发生调用,而无需关心这个子系统的内部细节外观模式的角色外观类(Facade):为调用者提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给...

2020-02-12 15:53:17 144

原创 设计模式---组合模式

假如我们有这样一个需求:需要展示一个学校想院系结构,一个学校下面有多个学院,一个学院下面有多个系:XX大学计算机学院计算机科学与技术软件工程网络工程师范学院中文系外语系传统的方案:系继承学院、学院继承学校。但实际上系、学院、学校之间并非继承关系,而是组合关系(部分和整体的关系)。组合模式简介组合模式又称部分整体模式,它创建了对象组的树形结构,将对象组合成树形结构以...

2020-02-12 10:57:29 132

原创 栈---中缀表达式转后缀表达式画图详解和代码实现

中缀表达式转后缀表达式思路步骤分析:1 初始化两个栈:运算符栈s1和存储中间结果的栈s22 从左至右扫描中缀表达式3 遇到运算符时,比较其与s1栈顶运算符的优先级3.1 如果s1为空,或栈顶运算符为左括号’(’,则直接将此运算符入栈;3.2 否则,如果优先级比栈顶运算符的高,也直接将此运算符入栈;3.3 否则,将s1栈顶的运算符弹出并压入s2中。然后又从3.1步开始进行比较(此时带入...

2020-02-11 18:06:16 3083

原创 单链表---约瑟夫环问题

分析:比如由5个节点组成一个环,从第1个节点开始报数,每报数2个节点删除一个节点,单链表如下:(1)设置一个helper辅助节点,指向最后一个节点:(2)因为是从第k个节点开始报数,因此先让first和helper走k-1步,这样first节点就指向报数的第一个节点了,k初始值为1,因此不用向前走(3)然后开始删除节点,每次让helper和first向前走1步,走了m-1步支行,fir...

2020-02-10 20:10:00 306

原创 设计模式---建造者模式

建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。比如建造一个房子要分为打地基、砌墙、封顶过程,不同类型的房子都需要经历着三个过程,只是具体实现不同而已。一般方法实现如下。传统模式AbstractHouse抽象类封装了建造房子的过...

2020-02-08 08:36:34 309

原创 设计模式的目的和七大原则

设计模式的目的和七大原则设计模式是为了让程序(软件)具有更好的:代码可重用性可读性(程序规范性)可扩展性(很方便的增加新功能)可靠性(增加新功能后,对原功能不会产生不利影响)使程序呈现高内聚、低耦合的特性七大原则:单一职责原则接口隔离原则依赖倒转原则里氏替换原则开闭原则迪米特法原则合成复用原则单一职责原则对类来说,即一个类应该只负责一项职责,如类A负责两个不...

2020-02-04 16:59:24 802

Xdebug_Helper.zip

亲测有效的Chrome_Xdebug_Helper_extension 安装步骤: 1 下载后解压 2 将extension_1_4_2.crx拖至谷歌的插件扩展页(如果报错,请进行下一步) 3 将extension_1_4_2.crx改名为extension_1_4_2.rar后解压 4 在chrome的扩展页面打开开发者模式后点击“加载已解压的扩展程序” 5 选择extension_1_4_2文件夹即可

2019-07-06

空空如也

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

TA关注的人

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