自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构与算法经典问题解析-Java语言描述

第三章 链表剑指 Offer 22. 链表中倒数第k个节点剑指 Offer 24. 反转链表141. 环形链表142. 环形链表 II160. 相交链表876. 链表的中间结点剑指 Offer 06. 从尾到头打印链表第三章 链表...

2020-09-08 20:14:00 319

原创 Java秒杀

目录1 登陆模块注册:用户填写账号密码,点击注册前端使用一个固定的salt值拼接到密码上前端使用md5加密拼接后的密码把拼接加密后的内容发送给后端后端再随机生成一个salt值,再次拼接到密码上后端把密码和那个随机生成的salt值都存到数据库里登录:用户提交密码,前端使用一个固定的salt值拼接到密码上前端使用md5加密拼接后的密码把拼接加密后的内容发送...

2020-04-16 08:31:00 267

原创 SpringBoot

1 将SpringBoot打成war包(1)添加Tomcat依赖,去除Tomcat<!-- 设置tomcat在打包时去除--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-t...

2020-04-16 07:48:00 241

原创 代理模式-结构型

1 模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象(如小图片和远程代理 对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式...

2020-04-01 15:34:00 265

原创 框架面试

SpringSpring DI(IOC) 是什么?如何实现?Spring AOP是什么?使用场景?底层如何实现?项目里用到了AOP?为什么要使用aop,直接抽取方法封装起来不行吗?待定spring bean的生命周期,注入方式参考:https://www.cnblogs.com/youngao/p/12576719.htmlspringmvc执行流程Spring...

2020-04-01 12:49:00 140

转载 银行家算法

​ 避免死锁同样属于事先预防的策略,但是并不是事先采取某种限制措施来破坏死锁的必要条件,而是在资源的动态分配过程中,防止系统进入不安全状态,以避免发生死锁。避免死锁这种方法对资源的分配限制条件较弱(相比于预防死锁),以期望获得更好的系统性能。​ 关于安全状态和不安全状态的概念,可以参看这篇博文。​ 银行家算法是我们的老朋友迪杰斯特拉为T.H.E系统设计的一种避免死锁产生的算法。该算法...

2020-03-31 18:06:00 441

原创 Hash函数相关

hash表1 hash函数地址index=H(key)即根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。1.1 hash函数的性质(1)输入域是无穷的,但是输出域是有限的(2)不是随机产生的输出,相同的输入一定对应相同的输出(3)不同的输入可能会导致相同的输出(hash碰撞)(4)输出的值在整个输出域几乎是均匀分布的(离散性)1.2 hash...

2020-03-30 16:55:00 366

原创 Hash算法总结

目录1 Hash函数2 Hash冲突3 一致性hashhash表1 hash函数地址index=H(key)即根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。1.1 hash函数的性质(1)输入域是无穷的,但是输出域是有限的(2)不是随机产生的输出,相同的输入一定对应相同的输出(3)不同的输入可能会导致相同的输出(hash碰撞)(4)输...

2020-03-30 16:55:00 541

原创 集合与多线程面试

集合Java中集合和数组的区别?一、集合和数组的区别区别1:数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值。集合只能存储引用数据类型(对象)。集合也能存储基本数据类型(有点矛盾,看后句),但是在存储的时候会自动装箱变成对象。区别2:数组长度是固定的,不能自动增长。集合的长度是可变的,可以根据元素的增长而增长。二、集合和...

2020-03-30 15:27:00 192

原创 重点题目

LeetCode83. 删除排序链表中的重复元素给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。LeetCode695. 岛屿的最大面积最大岛问题(我想了个分治,思路不对,直接爆炸,面试官还是不错的,给我换了道题)编程题2:股票利润1(还要求写测试用例,要求跑通)编程题3:股票利润2(可以买卖多次)(这两题都秒了,面试前一晚正好想刷一刷dp的题,就刷了...

2020-03-30 09:40:00 177

原创 算法题目

算法题LeetCode83. 删除排序链表中的重复元素LeetCode50. Pow(x, n)LeetCode103. 二叉树的锯齿形层次遍历LeetCode138. 复制带随机指针的链表LeetCode232. 用栈实现队列LeetCode104. 二叉树的最大深度LeetCode111. 二叉树的最小深度LeetCode344. 反转字符串Leet...

2020-03-30 09:40:00 537

原创 可能是全网最好的MySQL重要知识点

什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。事务...

2020-03-27 16:27:00 174

原创 Spring MVC 原理探秘 - 容器的创建过程

1.简介在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。正所谓兵马未动,粮草先行。这些操作包括创建容器,加载 DispatcherServlet 中用到的各种组件等。本篇文章就来和大家讨论一下这些初始化操作中的容器创建操作,容...

2020-03-27 15:18:00 124

原创 Spring MVC 原理探秘 - 一个请求的旅行过程

1.简介在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章。为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一下 Spring MVC 的一些原理。在本篇文章中,你将会了解到 Spring MVC 处理请求的过程。同时,你也会了解到 Servlet 相关的知识。以及 Spring MVC 的核心 D...

2020-03-27 15:16:00 137

原创 Spring AOP 源码分析 - 拦截器链的执行过程

1.简介本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程。现在我们的得到了 bean 的代理对象,且通知也以合适的方式插在了目标方法的前后。接下来要做的事情,就是执行通知逻辑了。通知可能在目标方法前执行,也可能在目标方法后执行。具体的执行时机,取决于用户的配置...

2020-03-27 15:14:00 157

原创 Spring AOP 源码分析 - 创建代理对象

1.简介在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的。现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 bean 的某些方法前后。与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源...

2020-03-27 15:12:00 114

原创 Spring AOP 源码分析 - 筛选合适的通知器

1.简介从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor)。在上一篇AOP 源码分析导读一文中,我简单介绍了 AOP 中的一些术语及其对应的源码,部分术语和源码将会在本篇文章中出现。如果大家不熟悉这些术语和源码,不妨去...

2020-03-27 15:10:00 154

原创 Spring AOP 源码分析系列文章导读

1. 简介前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅读了 AOP 方面的源码。开始以为 AOP 部分的源码也会比较复杂,所以原计划投入一周的时间用于阅读源码。但在我大致理清 AOP 源码逻辑后,发现没想的那么复杂,所以目前进度算是超前了。从今...

2020-03-27 15:09:00 214

原创 Spring IOC 容器源码分析 - 余下的初始化工作

1. 简介本篇文章是“Spring IOC 容器源码分析”系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bean 做最后的初始化工作。相较于之前几篇文章所分析的源码,initializeBean 的源码相对比较简单,大家可以愉快的阅读。好了,其他的不多说了,我们直入主题吧。2. 源码分析本章我们来分析一下 in...

2020-03-27 11:28:00 69

原创 Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

1. 简介本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的。我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反射创建一个原始的 bean 对象,然后再向这个原始的 bean 对象中填充属性。对于填充属性这个过程,简单点来说,JavaBean 的每个属性通常都有 getter/setter 方法,我们...

2020-03-27 11:13:00 59

原创 Spring IOC 容器源码分析 - 循环依赖的解决办法

1. 简介本文,我们来看一下 Spring 是如何解决循环依赖问题的。在本篇文章中,我会首先向大家介绍一下什么是循环依赖。然后,进入源码分析阶段。为了更好的说明 Spring 解决循环依赖的办法,我将会从获取 bean 的方法getBean(String)开始,把整个调用过程梳理一遍。梳理完后,再来详细分析源码。通过这几步的讲解,希望让大家能够弄懂什么是循环依赖,以及如何解循环依赖。...

2020-03-27 11:12:00 129

原创 Spring IOC 容器源码分析 - 创建原始 bean 对象

1. 简介本篇文章是上一篇文章(创建单例 bean 的过程)的延续。在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程。本篇文章,我们就从战术的层面上,详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。在本篇文章中,你将看到三种不同的构造 bean 对象的方式。你也会了解到构造 bean 对象的两种策略。如果你对...

2020-03-27 11:08:00 80

原创 Spring IOC 容器源码分析 - 创建单例 bean 的过程

1. 简介在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑。对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去创建,而是从缓存中获取。如果某个 bean 还未实例化,这个时候就无法命中缓存。此时,就要根据 bean 的配置信息去创建这个 bean 了。相较于getBean(String)方法的实现逻...

2020-03-26 20:40:00 51

原创 Spring IOC 容器源码分析 - 获取单例 bean

1. 简介为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章。在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一些建议。在做完必要的准备工作后,从本文开始,正式开始进入源码分析的阶段。在本篇文章中,我将会详细分析BeanFactory的getBean(String)方法实现细节,getBean(St...

2020-03-26 19:41:00 93

原创 Spring IOC 容器源码分析系列文章导读

1. 简介Spring 是一个轻量级的企业级应用开发框架,于 2004 年由Rod Johnson发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了。Spring 包含了众多模块,包括但不限于 Core、Bean、Context、AOP 和 Web 等。在今天,我们完全可以使用 Spring 所提供的一站式解决方案开发出我们所需要的应用。作为 Java...

2020-03-26 19:40:00 193

原创 Spring bean的生命流程

Spring 是一个轻量级的 J2EE 开源框架,其目标是降低企业级应用开发难度,提高企业级应用开发效率。在日程开发中,我们会经常使用 Spring 框架去构建应用。所以作为一个经常使用的框架,了解其原理还是很有必要的。接下来我们就从宏观层面上,来看看 Spring 中的 bean 由实例化到销毁的过程。在详细讨论 bean 生命周期前,先上一张图,后面也会围绕这张图展开讨论。图1...

2020-03-26 19:27:00 112

原创 自己动手实现的 Spring IOC 和 AOP - 下篇

1. 背景本文承接上文,来继续说说 IOC 和 AOP 的仿写。在上文中,我实现了一个很简单的 IOC 和 AOP 容器。上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块没有整合到一起。IOC 在加载 bean 过程中,AOP 不能对 bean 织入通知。在本文中,我们详细说一下升级版 IOC 和 AOP。这个版本的实现包含了在上篇中所说的功能,这里再重述...

2020-03-26 19:26:00 158

原创 自己动手实现的 Spring IOC 和 AOP - 上篇

1. 背景我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了。不过之前没有仿写过 Spring IOC 和 AOP,只是宏观上对 Spring IOC 和 AOP 原理有一定的认识。所以为了更进一步理解 Spring IOC 和 AOP 原理。在工作之余,参考了一些资料和代码,动手实现了一个简单的 IOC 和...

2020-03-26 19:25:00 144

原创 Java 序列化和反序列化相关整理

1. 概述Java 提供了一种对象序列化的机制,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。把对象转换为字节序列的过程称为对象的 序列化。将序列化对象写入文件后,可以从文件中读取出来,并且对它进行反序列化,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。把字节序列恢复为对象的过程称为对象的 ...

2020-03-26 19:01:00 219

原创 Java 反射相关整理

1. Class 类Class 是一个类,封装了当前对象所对应的类的信息,一个类中有属性,方法,构造器等。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。Class 对象只能由系统建立对象,一个类(而不是一个对象)在 Java 虚拟机中只会有一个 Class 实例。Class 对象的由来是将 class...

2020-03-26 18:46:00 119

原创 Java 泛型相关整理

1. 概述Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了 编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型,即 参数化类型。将类型由原来的具体的类型(类似于方法的变量参数,该变量定义了具体的类型),也定义成参数形式(可以称之为类型形参),然后在使用/调用时再传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新...

2020-03-26 18:34:00 144

原创 Java 动态代理实现

JDK 动态代理代理模式是常用的 JAVA 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 JDK 动态代理是 java.lang....

2020-03-26 14:50:00 68

原创 7 种阻塞队列相关整理

1. 简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。两个附加的操作。支持阻塞的 插入 方法,在队列为空时,获取元素的线程会等待队列变为非空。支持阻塞的 移除 方法,当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而...

2020-03-26 13:56:00 210

原创 Exchanger 相关整理

1. 简介Exchanger(交换者)是自 JDK 1.5 起开始提供的工具套件,源于 java.util.concurrent 包。是一个用于线程间协作的工具类。Exchanger 用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。此类提供对外的操作是同步的。用于 成对 出现的线程之间交换数据。可以视作双向的同步队列。可应用于基...

2020-03-26 13:40:00 139

原创 Semaphore 相关整理

1. 简介Semaphore 类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或逻辑的)线程数目。一个信号量有且仅有 3 种操作,且它们全部是原子的。初始化、增加和减少。增加可以为一个进程解除阻塞。减少可以让一个进程进入阻塞。Semaphore 管理一系列许可证。每个 acquire() 方法阻塞,直到有一个许可证可以获得然后拿...

2020-03-26 13:38:00 112

原创 ConcurrentLinkedQueue 相关整理

1. ConcurrentLinkedQueue在并发编程中有时候需要使用线程安全的队列,线程安全队列有两种实现方式。阻塞方式:对入队和出队操作加锁,阻塞队列。非阻塞方式:通过自旋 CAS 实现,例如:ConcurrentLinkedQueue。在中等规模的并发场景下,ConcurrentLinkedQueue 性能会高出不少,而且相当稳定。Concurren...

2020-03-26 13:36:00 232

原创 ConcurrentHashMap(1.8) 相关整理

1. ConcurrentHashMap1.1 HaspMap(JDK 1.8)JDK 1.8 HashMapJDK 1.8 对 HashMap 进行了修改,最大的不同就是利用了红黑树,其由数组+链表+红黑树组成。JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标,但之后需要顺着链表依次比较才能查找到需要的元素,时间复杂度取决于链表...

2020-03-26 13:33:00 125

原创 ReentrantReadWriteLock 相关整理

1. ReentrantReadWriteLock 概述ReentrantReadWriteLock 是 Lock 的另一种实现方式,ReentrantLock 是一个排他锁,同一时间只允许一个线程访问,而 ReentrantReadWriteLock 允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况...

2020-03-26 13:06:00 93

原创 LockSupport 工具相关整理

1. LockSupportLockSupport 是用来创建锁和其他同步类的基本线程阻塞原语。是一个简单的代理类,里面的代码都是使用 Unsafe 类里面的方法。JDK 对 LockSupport 的描述:Basic thread blocking primitives for creating locks and other synchronization classes...

2020-03-26 11:51:00 64

原创 Lock 相关整理

锁是用来控制多个线程访问共享资源的方式。Java 程序可以使用 syschronized 关键字实现锁功能,而 Java 5 之后,在并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能。Lock 提供了与 syschronized 关键字类似的同步功能,只是在使用时需要 显式地获取和释放锁。虽然缺少了 syschronized 关键字的隐式获取释放锁的便捷性(锁获取...

2020-03-26 11:50:00 96

空空如也

空空如也

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

TA关注的人

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