自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WALL.E

藏好自己,做好清理.

  • 博客(80)
  • 资源 (1)
  • 收藏
  • 关注

原创 用300行代码剖析SpringMVC的核心原理

文章目录写在前面首先看这张流程图总体实现分析DispatcherServlet详细实现分析 :现在开始写在前面本文的目的是使用300行代码实现Spring MVC 核心原理,读取配置文件,实现自己的ioc容器,实现依赖注入,再根据注解和对应的方法实例化HandlerMapping,更重要的是为之后的源码的阅读提供一个大概的轮廓.实现的最终结果图 :首先看这张流程图总体实现分析...

2019-11-02 15:30:02 504 1

原创 面试装X之--代理模式

文章目录代理模式(Proxy pattern)静态代理动态代理JDK实现的方式1.示例 : 专业的事交给专业的人去做,所以我们请了媒婆来findlove2. JDK实现代理详细分析CJLIB实现的方式总结代理模式(Proxy pattern)是指为目标对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介作用.主要目的 : 1. 保护目标对象2. 增强目标对象...

2019-10-25 14:32:11 324

原创 面试装X之--工厂模式

文章目录工厂模式一.简单工厂模式(Simple Factory pattern)二. 工厂方法模式(Factory Method Pattern)三.抽象工厂方法(Abstract Factory Method)工厂模式是创建对象的最佳方式, 属于创建型方式,在工厂模式中,我们在创建对象的时候不是向客户端暴露创建逻辑,并且是通过一个共同的接口指向创建的对象.示例:这里我们使用课程来做示...

2019-10-19 15:37:13 613

原创 面试装X之--单例模式深度探索(玩转面试官)

之前详细总写过(单例模式)的己种写法,今天对这几种方法进行更深层次的总结单例模式(Singleton Pattern)是指一个类确保在任何情况下都只有一个实例,并提供一个全局访问点.属于创建型模式单例模式重点总结1. 私有化构造器指无法从自身之外的类来创建对象2. 保证线程安全和延迟加载饿汉模式: 在类初始化的时候就创建出类的实例(线程安全),但是同时由于对象不是即用既得,会带...

2019-10-18 21:40:23 232

原创 二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路首先根据二叉树后序遍历的特点,左子树都小于根节点,而右子树均大于根节点从第0位开始,找到第一位比根节点大的元素,记录元素位置i,在此之前的元素都属于左子树(已经判定左子树都小于根节点)然后从i开始,判断右...

2019-10-15 21:19:49 140

原创 Redis-简单动态字符串(Simple Dynamic String )

Redis的设计与实现<一> 简单动态字符串(Simple Dynamic String )当Redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,Redis就会使用SDS表示字符串值.一. SDS的定义struct sdshdr{ int free ; //记录buf数组中未使用的字节数 int len ; //记录buf数组已使用的字节数 c...

2019-10-15 11:07:59 303

原创 Effective Java 读书笔记:(2) 遇到多个构造器参数时要考虑使用构建器

遇到多个构造器参数时要考虑使用构建器静态工厂和构造器都有个局限性,它们都不能很好地扩展到大量的可选参数.问题当一个类中的参数数量变得很多时,如何方便且灵活地创建含有不同参数的实例成了一个复杂的问题.解决方案1.普通方法重叠构造器模式(telescoping constructor),在这种模式下,提供的第一个构造器只包含必要的参数,第二个构造器包含一个可选参数,第三个构造器包含两个...

2019-10-11 10:38:38 137

原创 服务提供者框架(Service provider Framework)

服务提供者框架是指这样一个系统,多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把它它们从多个实现中解耦出来.关系图详解1. 服务接口(Service Interface)在服务接口里面定义一些提供具体服务的方法,假设我们需要实现登陆注册的服务UserService,这个服务接口中一定有login(),register()方法,我们之后再创建这个服务接口的具体的...

2019-10-10 14:45:29 603

原创 Effective Java 读书笔记:(1) 用静态方法代替构造器

用静态方法替代构造器对于一个类而言,为了让客户端获取到它的一个实例.在通常情况下,是提供这个类的构造器.类可以提供一个公有的静态工厂方法(static factory method),这是一个返回类的实例的静态方法.实例 : 下面是一个来自Boolean(基本类型boolean的装箱类)的简单实例,这个方法将boolean类型装换为一个Boolean的引用//JDK1.8 pub...

2019-10-10 10:04:34 240

原创 常用排序算法(希尔,归并,快排)

4. 希尔排序时间复杂度 : O(n^1.3) ~ O(n^1.5)空间复杂度 : O(1)稳定性 : 不稳定(因为在交换的过程中,有跳跃交换,所以不稳定)算法思想 :希尔排序是插入排序的优化版本,由于简单插入排序的只能交换相邻元素,所以每次只能将逆序对数减1,它通过交换不相邻的元素, 使得每次将逆序对数量减小大于1.首先将数组元素按照h=4间距分为数对,然后在这些数对之间进行一次插...

2019-09-08 12:52:17 376

原创 单例模式

单例模式单例模式多个线程操作同一对象,要保证对象的唯一性解决方案实例化过程只实例化一次提供返回实例的方法分类饿汉式public class HungrySingleton { //加载的时候就产生了实例对象 private static HungrySingleton Instanse = new HungrySingleton(); privat...

2019-08-04 21:33:27 232

原创 volatile关键字实现

Volatile 关键字实现原理线程的工作空间是 CPU寄存器和cache的抽象描述CPU修改数据 内存数据的步骤 :把内存中的数据读到cache中在cache中更新数据把更新的数据刷新到缓存数据的不一致问题解决方案 :总线加锁(粒度太大)MESI()​ a. 读操作: 不做任何操作,将cache中的数据读到寄存器中​ b. 写操作 : 发出信号通知其...

2019-08-04 15:02:59 182

原创 synchronized底层原理分析

synchronized底层原理并发叫号static : 并发量大的时候会出现 : 跳号.重号.超过最大值概念互斥性 :即同一时间只允许一个线程持有某个对象锁可见性 : 必须保证锁被释放之前,对共享变量所做的修改,对之后获得锁的对象是课件的用法修饰 : 静态方法 普通方法修饰 : 代码块monitor[监视器] : 每个对象都有一个monitor对象某一线程占有这个对象的时...

2019-08-03 12:37:13 210

原创 Java内存模型

方法区[线程共享区域]读取加载.class (字节码)class文件分析将源码转换为指令 new堆保存创建的的对象对象头数据体根据垃圾回收的需要分代回收划分区域程序计数器[线程各自独享]虚拟机栈[不同线程各自独享]方法集合 告诉线程要去执行哪个方法本地方法栈JVM内存模型基本概念程序 : 完成某一任务的代码序列(静态的概念)进程 : 程序在某些数据上的一次...

2019-08-03 12:18:37 142

原创 Java实现LRU

Java实现LRU简介LRU(Least Recent Used) 最近最少使用,是经常用在内存的调度算法,在内存不够的情况下,为了载入新内容,不断淘汰旧内容.实现原理使用HashMap 和 双向链表实现 LRUHashMap的 put 和 get 都是接近O(1),用HashMap的vlaue指向双向链表的Node节点的Index.双向链表在这里用来实现LRU存储,head代表头部,...

2019-07-29 21:00:37 211

原创 常用排序算法(冒泡,选择,插入)

排序算法及其优化1.冒泡算法原算法时间复杂度: O(n^2)空间复杂度: O(1)稳定性 :稳定排序思想 : 每趟排序将从头开始两两比较,按照大的在后小的在前的顺序进行交换,每趟可以确定最大的数在数组的末尾,需要遍历N趟,每次遍历(N-i)次.​ public static <T extends Comparable<T>> void...

2019-07-27 22:08:20 156

原创 Mysql索引

一.Mysql索引1. 没有索引的情况下进行查找select id from student where id = 1; 对于上面的查询语句进行分析:在一页中进行查找假设数据量比较少,只有一页的数据当查询条件为主键时这个过程就是通过页结构中的 Page Directory中的槽[spot]进行二分查找当条件为其他列时由于数据页没有为非主键建立页目录[也就是进行分组...

2019-07-22 21:53:53 238

原创 事务和索引-InnoDb的页

一. 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败.四大特性原子性 : 指事务中的所有操作,要么全部完成,要么全部不完成.一致性 : 在事务开始和完成时,数据都必须保持一致性的状态[中间状态的数据对外部不可见]张三向李四转账100元,保证张三账户减少100元,而此时又没有向李四账户添加,一致性就是保证这种中间状态数据对外部不可见,只有最初状态和最终状态...

2019-07-21 20:41:00 175

原创 范式-键-存储引擎

1.前情提要数据库的范式:第一范式: 要求表中不能有重复属性,而且属性不能再被拆分第二范式: 主键与普通属性之间的关系, 每个属性必须依赖于主属性第三范式: 主键与普通属性之间的关系, 每个属性只能依赖于主属性BC范式 : 候选键只有一个第四范式: 消除一对多属性 (爱好)超键,候选键,主键 : 属性集(身份证号,姓名,性别,年龄)超键 : 在关系中能够唯一...

2019-07-16 12:00:57 303

原创 AVL 自平衡二叉搜索树 (Adelson-Velskii and Landis)[一]

简介BST退化: 在添加一组递增元素时,BST会退化成一个链表,查询效率降低为O(n).AVL是为了解决BST 退化而造成的查询效率降低的问题,最主要对BST进行了结构性的改变(进行旋转).平衡: 节点的左右子树高度之差不能超过1.AVL树的最差.最好.平均的增删插的时间复杂度为 O(log<2> N).AVL的最差情况下,增删查需要旋转树的高度次 O(log<2&gt...

2019-07-11 16:05:10 682

原创 BST 二叉搜索树 (binary Search Tree )[三]

10.求data1和data2的最近公共祖先节点 ,并返回它的值由于其最近公共祖先节点一定介于 data1 与 data 2 之间可以不断对当前节点的data与之比较,从而降低规模 public T getLCA(T data1, T data2) { if (root == null) { return null; } ...

2019-07-09 19:52:09 183

原创 BST 二叉搜索树 (binary Search Tree )[二]

1. BST非递归插入首先通过不断比较,找到cur == null 情况下的cur的父节点(parent)再经过和其父亲节点的data比较然后再将其插入到孩子域中public void non_insert(T data) { if (this.root == null) { root = new BSTNode<>(data, null, nul...

2019-07-07 20:33:24 195

原创 java 的四种引用以及它的使用场景

参考:java中四种引用类型简介在java1.2开始,为了使程序能更加灵活的控制对象的生命周期,将对象的引用分为四种级别.详细说明强引用(StrongReference)强引用是使用最广泛的引用.如果一个对象具有强引用,那么垃圾回收器据对不会回收它.当空间不足时,jvm宁愿抛出OutOfMemoryError错误,是程序异常终止,也不会通过回收强引用的对象来解决内存不足的问题.如果...

2019-07-07 00:34:10 332 1

原创 Java Collection集合类 - HashMap 可能出现的死循环问题

问题描述问题 : 服务器cpu被100%的线上故障,是因为java语言在并发情况下使用了HashMap造成Receive Condition (竞态条件 : 并发访问出现冲突,结果不正确)首先HashMap是非线程安全的数据结构,在单线程的程序中使用,是没有问题的.但是在多线程程序中,就可能出现问题.HashMap回顾HashMap 通常会使用一个数组(table[] 来分散所有的k...

2019-06-30 16:55:54 199

原创 Java Collection集合类 - HashMap 与HashTable的不同点

1.代码版本HashTable * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter * @see Object#equals(java.lang.Object) * @see Object#hashCode() * @see Hashtable#rehash() * ...

2019-06-24 10:46:47 247

原创 排序算法之 堆排序

简介堆是完全二叉树(对应满二叉树,每个节点的序号一一对应)每个结点都大于或者等于左右子结点的值称为大顶堆每个结点都小于或者等于左右子节点的值称为小顶堆堆排序是不稳定排序 稳定性问题以后讨论排序思想(大顶堆),小顶堆类似首先通过要排序数组构造大顶堆(这一步可以将数组的最大值放在数组的首位)交换数组的首尾元素数组的长度减一继续构造大顶堆,重复2得到由小到大排序的数组(大顶堆...

2019-06-23 20:27:30 232

原创 BST 二叉搜索树 (binary Search Tree )[一]

简介二叉搜索树是一种特殊的二叉树 在我看来感觉象将二分查找图像化.满足以下条件 :每个节点最多有两个孩子每个节点的值,都大于左孩子,而小于右孩子特点首先在每一层上二叉树的节点最大为 2^(i-1) (i为层数).二叉树的深度为k = [log2(n)]+1(n为总的节点个数).代码BSTNode值得注意的是 :get和set方法直接生成就好定义左右孩...

2019-06-23 00:54:28 256

原创 Java Collection集合类- HashMap源码分析

简介:HashMap主要用来存放键值对,它基于哈希表的Map接口实现JDK 1.8 之前HashMap由数组 + 链表 组成,数组是HashMap的主体 ,链表主要是为了解决哈希冲突而存在的("拉链法"解决冲突),在JDK1.8之后在解决哈希冲突时,当链表长度大于阈值(默认为 8 ),将链表转化为红黑表,减少搜索时间.底层数据结构JDk1.8之前jdk1.8之前HashMap底层是...

2019-06-22 00:48:16 256

原创 Java Collection集合类- LinkedList 源码分析

LinkedList简介:LinkedList 是实现了 List接口 和 Deque接口 的双向链表 . LinkedList 底层的链表结构使他支持高效的插入(尾插)和删除操作,此外它实现了Deque接口,使得LinkedList也具有队列的特性;LinkedList不是线程安全的.如果想使LinkedList 变成线程安全的,可以调用静态类 Collections类中的synchron...

2019-06-21 13:26:33 257 1

原创 Java Collection集合类- ArrayList 源码分析

ArrayList 简介ArrayList的底层是数组,相当于动态数组,它的容量能动态增长.public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable它继承了Abst...

2019-06-18 13:20:00 248

原创 二叉树的创建以及三种遍历方式

二叉树的创建 :TreeNode:public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}BitTreeimport java.ut...

2019-06-16 16:35:37 392

原创 剑指offer- 栈的压入.弹出序列

题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)主要思想首先建立一个辅助栈,将pushA[]里面的元素压入栈中,当要压入的元素等于...

2019-06-07 00:47:08 182

原创 剑指offer - 用两个栈实现队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。基本思想队列的特点是先进先出stack1用来一直添加数据,在需要pop时,将其全部转移至stack2中,此时已经将顺序调转过来了.在pop之后如果有push,还是保存到stack1中,在stack2 pop 为空后,再将其转移到stack2中. public class Solution {...

2019-06-03 00:28:33 153

原创 剑指offer - 替换空格

题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思想1 .暴力破解 . 遇到空格就将后面字符全部向后移动,这样会造成重复移动的问题,时间复杂度O(n2)2.首先将字符串中的空格个数计算出来,然后将原来的字符串长度增长,从末尾开始进行遍历,遇到空格就替换,其他元素就复制,...

2019-05-26 15:26:57 186

原创 剑指offer - 求1+2+3+...+n

题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。分析 :代码:public static int Sum_Solution(int n) { int ans = n; boolean t = ((ans != 0) && ((ans += Su...

2019-05-25 14:13:53 254

原创 KMP算法初步解析

KMP算法 : 解决的是串匹配问题next数组的求解主要代码求解next : public static int[] getnext(char[] str2) { int n = str2.length; int i = 0; int[] next = new int[str2.length]; next[0] = ...

2019-05-24 16:49:45 192

原创 剑指offer -合并两个排序链表

题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。主要思想 : public static ListNode Merge(ListNode list1, ListNode list2) { ListNode head = null; if (list1 == null && list2 =...

2019-05-22 17:03:57 191

原创 剑指offer - 链表中倒数k个节点

题目描述:输入一个链表,输出该链表中倒数第k个结点。主要思想 :代码实现 : public static ListNode FindKthToTail(ListNode head, int k) { ListNode fast = head; ListNode slow = head; if (head == null) { ...

2019-05-22 11:39:50 137

原创 剑指offer - 反转链表

题目描述 :输入一个链表,反转链表后,输出新链表的表头。(注意: 题目未告知无头节点还是有头节点,最终测试得知为无头节点)主要思想 :public static ListNode ReverseList(ListNode head) { if(head == null ){ return null; } if (hea...

2019-05-22 11:01:18 157

原创 双向链表的实现

双向链表:/** * TODO : 双向链表的实现 * * @param <T> */public class DoubleLinkList<T> { Entry<T> head; public DoubleLinkList() { head = new Entry<>(null, null, null...

2019-05-19 01:11:42 209

spring-1.0.zip

本文的目的是使用300行代码实现Spring MVC 核心原理,读取配置文件,实现自己的ioc容器,实现依赖注入,再根据注解和对应的方法实例化HandlerMapping,更重要的是为之后的源码的阅读提供一个大概的轮廓.

2019-11-02

空空如也

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

TA关注的人

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