- 博客(64)
- 收藏
- 关注
原创 Spring @Aspect简单使用
一、AOP概念在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP指的是一种编程思想,是OOP的补充和完善,这篇博客里主要介绍 Spring
2020-09-15 20:16:13
8318
原创 Spring 参数解析器
一、背景在实际开发中,某些场景下要求开发者对前台传入的参数进行个性化解析、校验、或者获取header中信息等等,这时候我们就需要利用自定义参数解析器来满足这些需求二、DispatcherServlet运行流程DispatcherServlet 的结构如下,可以看出这个本质上还是个servlet在实际的调用逻辑中,前端请求过来之后执行 servlet 的 service() 方法,方法核心调用 DispatcherServlet 的 doservice() 方法,其中最核心的是 dodis
2020-09-12 19:18:18
1167
原创 Java 日期相关工具类
大概有5个多月没更,又懒又忙,公司用mac,回家用台式,这快捷键的切换对我来说真是。。。。太难了。不过再懒再忙再难也要学习呀,毕竟落后就要挨打,加油加油加油~~~在实际的业务开发中,不免会用到几类日期相关类:Date、SimpleDateFormat、Duration、Calendar 以及 DateUtils等,下面就来详细介绍下,做个笔记,也希望对其他人有所帮助。一、Date 类 (java.util.Date)最常用的基础日期类 继承Serializable, Cloneable, Com
2020-08-02 12:48:16
774
原创 Java 数据结构与算法之回溯法
一、概念回溯法是一种优选搜索法,按照优先条件深度优先搜索,以达到目标。当搜索到某一步时,发现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术成为回溯法,而满足回溯条件的某个状态成为“回溯点”二、思想回溯法是从初始状态出发,按照深度优先搜索的方式,根据产生子节点的条件约束,搜索问题的解。当发现当前节点不满足条件时,就回溯,尝试其他的路径。回溯法是一种“能进则...
2020-02-23 15:59:41
424
原创 Java 数据结构与算法之动态规划
序《Dynamic Programming》中的“Programming”不是编程的意思,而是指一种表格处理法,DP把每一步得到的子问题结果存储在表格里,每次遇到该子问题时不需要再求解一遍,只需要查询表格即可。一、概念动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干...
2020-02-23 15:19:41
227
原创 Java 设计模式之代理模式(Proxy)
一、代理模式代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问代理模式一般分为三类:静态代理、动态代理以及CGLIB代理。二、静态代理目标类和代理类都要实现接口用户需求:火车票体系需求分析:现在已经有国家正式的卖票软件12306,但是好像它并不好用 智行代理售票,抢票概率高(这里没体现,现实我也没感觉),但是要加手续费类图设计:代码示例...
2020-02-19 21:19:08
205
原创 Java 设计模式之模板模式(Template)
一、模板模式前几个模式,比如策略模式是封装了算法(行为),工厂模式封装了对象的创建,命令模式封装了方法的调用(这个博客还没写,后面看看补一下),今天要写的模板模式是一种行为型模式,封装的也是算法,跟策略模式比较像又有一些不同模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤类图:Abstr...
2020-02-18 22:32:39
382
原创 Java 设计模式之适配器模式&外观模式(Adapter&Facade)
一、适配器模式将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间适配器模式属于一种结构性模式,分为两种适配器:对象适配器和类适配器对象适配器类图:Client:只能看到Target接口,调用 request() 方法 Target:目标接口package Adapter;public interface Target { p...
2020-02-18 21:53:37
392
原创 Java 设计模式之工厂模式(Factory)
一、简单工厂简单工厂是一种编程习惯,把变化的代码(new 对象)封装在一个工厂里用户需求:客户想要在pizza店orderPizza需求分析:首先只有1个pizza店,有不同种类的pizza,不同客户order不同种类的pizza 如果在pizza店的类里用 if else 编码,一旦有新种类就需要改pizza店的代码 这里新建一个对象,封装创建pizza对象的部分,这个对...
2020-02-17 21:12:19
391
原创 Java 设计模式之装饰器模式(Decorator)
一、装饰器模式装饰器模式(Decorator Pattern):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案类图:Component:组件 ConcreteComponent:将要动态加上新行为的对象,扩展自Component Decorator:每个装饰者都有一个组件,就是说装饰者有个实例变量以保存某个Component的引用,这是装饰者共同实...
2020-02-16 14:31:29
713
原创 Java 设计模式之观察者模式(Observer)
一、观察者模式(Observer Pattern)观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新主题和观察者松耦合 主题唯一依赖的是一个实现Observer接口的对象列表二、模式详解...
2020-02-16 13:23:21
248
原创 Java 设计模式之策略模式(Strategy)
一、策略模式策略模式(Strategy Pattern):定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。此模式属于行为型模式的一种。二、模式详解游戏项目开始伊始,有各种鸭子,可以呱呱叫(quack),可以游泳(swim)。这里设计了超类,每个鸭子类型都继承超类过段时间后,发现玩家们想要这个鸭子可以飞,这好办,我就在超类Duck中添加...
2020-02-15 18:01:36
932
原创 Java 数据结构与算法之贪心
序 一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案——《算法导论》一、概念二、贪心思想从问题的某一初始解出发:while (朝给定总目标前进一步){利用可行的决策,求出可行解的一个解元素。}由所有解元素组合成问题的一个可行解;三、适用范围优缺点等四、场景示例...
2020-02-15 11:45:39
236
原创 Java 数据结构与算法之链表
序作为一种基本数据结构,链表(Linked List)是一种物理存储单元上非连续的存储结构,元素的逻辑顺序是通过链表的指针来实现的。这种存储方式使链表具备插入数据复杂度 O(1) 查找复杂度 O(n) 的特性。链表一般分为三种:单向链表、双向链表、循环链表。一、单向链表单向链表是一种线性表,由节点(ListNode)组成,节点是由存储的对象(object)以及对下一个节点的引用(nex...
2020-02-08 15:36:22
221
原创 Java 数据结构与算法之DFS、BFS
在使用BFS和DFS遍历图的时候,一般都会维护一个set或者visit数组,标记被访问过的节点,在遍历时需要判断是否被访问过一、DFS(深度优先遍历)DFS采用递归和栈,从起点顶点开始,递归访问其所有邻近节点。Step1:下图 DFS(1) 访问节点1,Visited标注为T,以1为顶点,准备访问1的邻近节点0Step2:下图 DFS(0) 访问节点0,Visited标注为T,...
2020-02-07 22:46:20
750
原创 Java 数据结构与算法之堆
一、堆堆是一种基本的数据结构,本质是一棵完全二叉树。堆分为最大堆和最小堆。堆常用于构建优先队列,堆排序,哈夫曼树/编码等。最大堆:父节点的值比所有子节点的值都要大或者相等 最小堆:父节点的值比所有子节点的值都要小或者相等(如下图)如上图所示,堆的底层数据结构通常采用数组来存储1、插入以最小堆为例,插入后依然保持最小堆的特性,首先针对下面的最小堆,插入数据1数据...
2020-02-06 20:54:53
181
原创 Java 数据结构与算法之二叉树
一、树的概念1、树的概念:树,作为非线性数据结构的典型例子,不再是一对一,而是一对多的关系。示例图如下根节点(root) :最顶部节点,唯一的 父节点和子节点:parent,child是相对的 子节点:每个子节点只有一个父节点 叶子节点:没有子节点的节点称为叶子节点(leaf)2、树的相关术语:示意图如下节点的度:该节点的子节点个数,8的度为2 树的度:这棵树内子节点...
2020-02-05 22:39:08
360
原创 Java IO学习之Properties类
一、Properties1、类源码:Properties 继承 HashTable,属于一个持久的属性集合,以 key-value 键值对形式存在class Properties extends Hashtable<Object,Object> {2、类方法:除了HashTable定义的方法,Properties定义了下列方法,表格来源——菜鸟教程序号 方法描...
2019-08-29 23:20:17
155
原创 Java IO学习之装饰器&适配器模式
一、装饰器模式概念:又名包装(Wrapper)模式,动态地给对象添加额外的职责,从增强功能的角度来说,Decorator模式比子类继承更加灵活,Decorator模式以对客户端透明的方式扩展对象功能应用场景:以动态、透明的方式增强对象功能 增强的功能可以被撤销 无法采用子类继承增强的情况装饰器结构:Componet:定义一个抽象类//可以是接口,可以是抽象类publ...
2019-08-28 22:28:05
454
原创 Java IO学习之IO流分类及其常见用法
一、IO流分类图流概念——传送门二、IO流常见用法所有流相关的要养成好的编码习惯,在最后关闭打开的流,调用close()方法。1、基类流(InputStream/Reader,OutputStream/Writer)前者是输入流的抽象基类,后者是输出流的抽象基类,抽象基类意味着他们不能被实例化。InputStream,操作字节数组int read():输入流读取单...
2019-08-18 15:01:15
214
原创 Java 集合学习之Set(HashSet&LinkedHashSet&TreeSet)
一、Set集合类思维导图Set:不允许重复的集合。不会有多个元素引用相同的对象。二、HashSet、LinkedHashSet及TreeSet区别简述HashSet:继承AbstractSet类,实现Set、Cloneable、Serializable接口,非线程安全,无序public class HashSet<E> extends AbstractSet<...
2019-08-12 23:44:54
291
原创 Java 集合学习之List(ArrayList&Vector&Stack&LinkedList)
一、List集合类思维导图List:存储一组不唯一(可以有多个元素引用相同的对象),有序的对象二、ArrayList、Vector、Stack及LinkedList区别简述ArrayList:继承自AbstractList,实现了List接口,非线程安全,动态数组public class ArrayList<E> extends AbstractList<...
2019-08-11 22:11:21
250
原创 Java 集合学习之Map(HashMap&Hashtable&LinkedHashMap&TreeMap)
一、Map集合类思维导图Map:使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。二、HashMap、Hashtable、LinkedHashMap及TreeMap区别简述Hashmap:散列表,存储Key-Value值,继承于AbstractMap,实现Map、Cloneable、S...
2019-08-11 17:21:45
244
原创 Java String、StringBuilder及StringBuffer学习总结
String如下图所示,String在java中被声明为final class,String的值是不可变的。这会导致String相关操作基本都会产生新的String对象,如果这样操作很多,会大量浪费内存空间,效率低下,对程序性能影响较大。StringBufferStringBuffer是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。StringBuilder的对象是变量,...
2019-08-08 23:12:17
364
原创 Java 多线程学习五(死锁)
一、线程死锁多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。二、死锁产生的原因产生死锁必须满足以下四个条件,只要破坏任意一条,就可避免死锁互斥条件:资源在一段时间内仅能为一个进程所战...
2019-08-02 22:34:06
127
原创 Java 多线程学习四(ThreadLocal)
一、ThreadLocal的概念ThreadLocal并不是线程,而是Thread的一个局部变量,每个线程都有自己的ThreadLocal变量,可以通过get()和set()方法来获取相应值。ThreadLocal设计的初衷是为了解决多线程编程中的资源共享问题,不同于synchronized,ThreadLocal是为每个使用该变量的线程提供独立的变量副本,在各自线程内部,相当于“全局变量”,...
2019-08-01 23:23:46
159
原创 Java 多线程学习三(单例模式与多线程)
一、什么是单例模式?单例模式(Singleton)是一种比较常用的设计模式,在应用场景中,单例模式的类的对象有且只有一个。例如打印机只有一台,避免两个任务同时下发到打印机中,通信端口只有一个,避免多个请求同时调用通信端口,这样的情况下,单例模式是非常有用的。从程序的角度上,单例模式就是确保一个类只有一个实例,并提供一个访问它的全局访问点。二、如何保证实例唯一?构造方法私有化:防止外部初...
2019-07-31 23:33:44
144
原创 Java 多线程学习二(线程池)
一、为什么使用线程池?前一篇博客里简单列举了几种实现线程的方法,在一个项目中,线程很多的情况下,每次都要去new线程,创建时间T1,线程存在时间T2,销毁时间T3,如果T1+T3>T2,这样就会造成内存消耗,而且不断创建新的线程,占用过多的系统资源,会导致死锁以及OOM。使用线程池的好处降低资源消耗:通过重复利用已创建的线程降低T1和T3造成的消耗 提高响应速度:当任务到达时,...
2019-07-31 22:34:34
117
原创 Java 多线程学习一(三种实现方式)
一、为什么要使用多线程编程?先从总体上来说:从计算机底层来说:线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。 从当代互联网发展趋势来说:现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体...
2019-07-30 23:29:20
135
原创 Java Arrays工具类
Java中对数组专门封装了一个工具类Arrays,在平时编程用到的比较多,这里整理下asList(arr):返回由指定数组支持的固定大小的列表import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class ArraysToolsDemo { public static...
2019-07-29 23:34:31
252
原创 Java 实现栈的三种方式
栈:LIFO(后进先出),自己实现一个栈,要求这个栈具有push()、pop()(返回栈顶元素并出栈)、peek()(返回栈顶元素不出栈)、isEmpty()这些基本的方法。一、采用数组实现栈提示:每次入栈之前先判断栈的容量是否够用,如果不够用就用Arrays.copyOf()进行扩容import java.util.Arrays;/** * 数组实现栈 * @param &...
2019-07-21 12:34:00
47332
5
原创 Java super、final和static关键字
一、Super关键字1、非构造方法中的super关键字访问父类成员(变量和方法)如果子类方法覆盖父类的方法,在子类中可以通过super关键字调用被重写的方法class father { //私有,子类不可访问 private String str = "let's play some dota"; public String str1 = "dota"; ...
2019-07-20 14:58:59
180
原创 Java 实现“多继承”
一、Java语言特点Java是一种简单、面向对象、分布式、易读、鲁棒、安全、结构明晰、可移植、高性能、多线程、动态的语言。面向对象(继承、封装、多态) 一次编译,到处运行(JVM实现跨平台运行) 可靠性 安全性 支持多线程(对比C++没有内置多线程机制) etc...二、Java为什么不支持多继承?多继承:指一个子类同时继承多个父类,从而具备多个父类的特征多继承会造成...
2019-07-20 12:49:19
41397
4
原创 Java 重写(override)和重载(overloading)的区别
重载和重写是类的多态性的重要体现,也是两个比较容易混淆的概念,这里做个学习笔记,mark下一、重写和重载的区别1、override概念:存在于子类中,对父类允许访问的方法进行重写,返回值和形参都不能改变,即外壳不变,核心重写,是父类和子类间多态性的体现。//定义动物类class Animals{ public void move() { System.out.printl...
2019-04-23 21:23:38
766
原创 Java 数组小结
平时声明和初始化数组总会弄错,这里系统的做个小结,记录下一、Java数组声明及初始化1、数组声明:datatype[] arrayname:个人推荐的写法 datatype arrayname[]2、数组初始化初始化是最容易出问题的地方,方式一共有两种:静态初始化,动态初始化。2.1、静态初始化在声明的同时,完成对数组的初始化(以String int为例)int[...
2019-04-19 19:24:02
372
原创 Java 字符串小结
一、字符串定义1、直接定义:用双引号表示字符串内容//直接赋值String str1="Java is the most beautiful programming language";String str2;str2="Java is the most beautiful programming language";2、String类定义:实例化String对象Stri...
2019-04-17 20:26:58
189
原创 Java 深入学习字符串equals()和“==”的区别
博主在实际开发过程中,判断界面元素element.getText()与期望值是否相等时,采用==出现判断错误,在网上查阅了很多资料,这里做个总结,记录学习过程。要理解equals和==的区别首先要理解Java内存中的对象和数据是如何存储的。一、栈、堆以及常量池的概念和区别任何程序在运行时都要在内存中开辟控件,java运行时虚拟机来做这个事情。栈(stack):一片内存区域,用来存储局部...
2019-04-16 22:17:47
211
原创 Python 字符串小结
平时敲代码的时候字符串处理规范,方法和一些小技巧总会记不住,需要现查,这里mark小结一下一、字符串定义在Python中,单引号和双引号在表示字符串没有区别str1="Python is 'beautiful'"str2='Python is "beautiful"'print str1print str2这样做的优点从上面代码可以看出,单引号定义字符串,里面双引号被认定是...
2019-04-13 20:07:26
292
原创 Python 队列(Queue)用法
一、队列(Queue)Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。常用方法:Queue.qsize() 返回队列的大小 Queue.empty() 如果队列为空,返...
2019-04-10 19:10:36
240956
10
原创 Python 多线程编程
一、线程和进程线程和进程的概念:进程:是资源(CPU、内存等)分配的基本单位,是程序执行时的一个实例。进程拥有自己的地址空间、内存、数据栈以及其它用于跟踪执行的辅助数据库,进程间通过IPC(进程间通信)的方式共享信息。 线程:是CPU调度和分派的基本单位,是程序执行的最小单位。线程有自己的堆栈和局部变量,线程间共享进程的所有资源。线程和进程区别和联系:进程是资源分配的最小单位,而线...
2019-04-09 22:32:34
302
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人