自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 事务

概述事务是一组原子性的SQL查询,或者说一个独立的工作单元,如果数据库引擎能够成功执行改组查询的全部语句,就执行该组查询,否则,只要有一条语句崩溃或因其他原因无法执行,那么所有语句都不执行。可以用START TRANSACTION开始一个事务,然后用COMMIT提交事务将修改的数据持久保留,或者用ROLLBACK撤销所有的修改。事务的ACID特性原子性(atomicity)...

2018-08-31 18:20:18 158

原创 Java异常

处理错误假设Java程序在运行期间出现了一个错误,该错误可能是文件包含了错误信息、网络连接出现问题、使用无效的数组下标、使用一个没有被赋值的对象造成的,在出现这些错误时,程序应该做到其中一点:返回到一种安全状态,并能够让用户执行一些其他的命令;允许用户保存所有操作的结果,并以妥善的方式终止程序。 异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器。...

2018-08-31 18:19:38 133

原创 部署Java应用程序

JAR文件Java归档(JAR)文件用于将应用程序打包成一个单独的文件,一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件。JAR文件是压缩的,使用了ZIP压缩格式。创建JAR文件在jdk/bin目录下的jar工具可制作JAR文件,创建JAR文件常见命令格式为:jar cvf JARFileName File1 File2 … 。此外,还有一些其他命令,...

2018-08-29 15:31:08 3497

原创 回溯法(Back-Tracking Algorithms)

回溯法回溯法是一种类似于分治的设计技术,用来求解最优化问题并寻求可行方案。 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。在回溯法中,可以把所有的路径看作一棵树,在这棵树中,结点有三种:...

2018-08-28 18:21:36 656

原创 动态规划(dynamic programming)

一、相关定义最优化问题(optimization problem)这类问题可以有很多可行解,每一个解都有一个值,我们希望寻找具有最优值的解,我们称这样的解为问题的一个最优解(an optimal solution)。动态规划动态规划与分治法类似,都是通过组合子问题的解来求解原问题。分治法将问题划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来,求出原问题的解。与...

2018-08-27 05:15:01 236

原创 多路查找树(B树)

多路查找树(muitl-way search tree)多路查找树每一个结点的孩子数可以多于两个,且每一个节点处可以存储多个元素。2-3树2-3树的每一个结点都具有两个孩子(2结点)或三个孩子(3结点)。一个2结点包含一个元素和两个孩子(或没有孩子),且与二叉排序树类似,左子树包含的元素小于该元素,右子树包含的元素大于该元素与二叉排序树不同的是,这个2结点要么没有孩子,要么就有...

2018-08-25 20:10:36 419

原创 线程安全与锁优化

线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。Java语言中的线程安全按线程的安全程度由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。...

2018-08-25 01:55:58 124

原创 Java内存模型与线程

Java内存模型Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model, JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在JDK1.5以后,Java内存模型就已经成熟和完善起来了。主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存...

2018-08-24 16:54:48 117

原创 Java虚拟机晚期(运行期)优化

概述Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个代码或代码块的运行特别频繁时,就会把这些代码认定为热点代码(Hot Spot Code),在运行时,虚拟机会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT)。HotSpot虚拟机内的即时编译器解释器与编译器解释器与编译器两者各有优势:当程序需要迅速启动和...

2018-08-23 23:07:47 308

原创 Java虚拟机早期(编译期)优化

概述Java的编译期可能是一个前端编译器把.java变成.class的过程,也可能是虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转换成机器码的过程。还可能是使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把.java文件编译成本地机器代码的过程。本文的编译期和编译期都指第一类编译期。Javac这类编译器对代...

2018-08-23 03:04:59 140

原创 类加载及执行子系统的案例分析

概述在Class文件格式与执行引擎这部分中,用户的程序能影响的内容并不太多,能通过程序进行操作的,主要是字节码生成与类加载器这两部分的功能。案例分析Tomcat:正统的类加载架构主流的Java Web服务器如Tomcat、Jetty、WebLogic、WebSphere都实现了自己的类加载器。一个功能健全的服务器,要解决如下几个问题:部署在同一个服务器上的两个Web应...

2018-08-22 03:36:45 173

原创 虚拟机字节码执行引擎

概述执行引擎是Java虚拟机最核心的组成部分之一,虚拟机可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。执行引擎在执行代码时,可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备,甚至包含几个不同级别的编译器执行引擎。但从外观来看,所有Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字...

2018-08-21 21:28:25 168

原创 虚拟机类加载机制

概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类型的加载、连接和初始化过程都是在程序运行期间完成的,基于这个特点,Java可以扩展动态语言,如Applet、JSP和OSGi等。类加载的时机类的生命周期如下图所示: 其中,加载、验证、准备、初始化、卸载的顺序是确定...

2018-08-20 21:53:55 113

原创 Class文件

无关性不同平台的Java虚拟机与所有平台都使用统一的程序存储格式字节码(ByteCode)来实现Java的平台无关性。此外,在Java虚拟机上也开发出了许多语言,包括Clojure、Groovy、JRuby、Jython、Scala等。Java虚拟机不和包括Java在内的任何语言绑定,它只与Class文件关联,Class文件中包含了Java虚拟机指令集和符号表以及其他辅助信息,虚拟机并不关心C...

2018-08-19 19:21:10 4566

原创 虚拟机性能监控与故障处理工具

JDK监控和故障处理工具JDK的bin目录下有许多命令行工具,他们大多数是在tools类库实现的,借助这些工具,我们可以直接在应用程序中实现功能强大的监控分析功能。监控和故障处理工具如下表所示: 名称 主要作用 jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。 jsat JVM Statisti...

2018-08-18 02:24:08 186

原创 垃圾收集器(Garbage Collection)与内存分配策略

程序计数器和栈区域随线程而生,随线程而灭,栈中的栈帧随方法的进入退出执行出栈和入栈操作,每一个栈帧分配的内存是在编译期可知的,在线程结束时,内存随之回收。堆和方法区的内存只有在运行期才能确定,这部分内存分配和回收是动态的,所以只讨论这部分内存。判断对象是否已死可达性分析算法(Reachability Analysis)可达性分析的基本思路是通过一系列的称为“GC Roots”的...

2018-08-17 22:20:39 1829

原创 OutOfMemoryError异常

在虚拟机规范中,除了程序计数器,其他区域都有OutOfMemoryError异常的能,下面就实践一下这些异常。Java堆溢出Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。这是一个堆内存溢出的例子:package outofmemoryerror;...

2018-08-17 01:50:06 146

原创 JAVA内存区域

运行时数据区域运行时数据区如图所示: 程序计数器(Program Counter Register)程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。为了线程切换后能恢复到正确的执行位置,每条线程都需要有...

2018-08-16 03:50:05 122

原创 设计模式总结

设计模式的定义模式是在某情境下,针对某问题的某种解决方案。设计模式分类分类图如下: 设计原则找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。针对接口(超类型,可以是抽象类也可以是接口)编程,而不是针对实现编程。 多用组合,少用继承。(多用has-a,少用is-a)为了交互对象之间的松耦合而努力。类应该对扩展开放,对修改关闭。要依...

2018-08-15 23:17:44 144

原创 复合模式(Compound Pattern)

什么是复合模式模式通常被一起使用,并被组合在同一个设计解决方案中。复合模式在一个解决方案中结合两个或多个模式,已解决一般或重复发生的问题。模式合作在实际工作中,可以采用不同的设计模式解决各种问题,下面是一个例子:首先要创建一群呱呱叫的鸭子类,让他们实现接口Quackable:public interface Quackable { public void qua...

2018-08-15 21:56:16 2376

原创 代理模式(Proxy Pattern)

远程代理远程代理好比”远程对象的本地代表”。远程对象是一种对象,活在JVM堆中,本地代表是一种可以由本地方法调用的对象,其行为会转发到远程对象中。客户对象调用本地堆中的代理对象上的方法,再由代理处理所有网络通信的低层细节。当调用完毕,结果值也通过网络从远程送回我们的客户。可以利用RMI实现远程调用。远程方法远程方法包括四个对象:客户对象、客户辅助对象(代理)、服务辅助对象、服务...

2018-08-14 23:03:31 215

原创 反射(Reflection)

JavaBean什么是JavaBeanBean是一个类,它的作用是:通过方法名称表示这是一个属性、一个事件还是一个普通的方法,它有自己的方法命名规则:对于一个名称为xxx属性,通常要写两个方法getXxx和setXxx,任何浏览这些方法的工具,都会把get或者set后的第一个字母转成小写,以产生属性名。get方法返回类型与set方法参数类型相同;对于布尔型属性,可以使用get和...

2018-08-14 20:46:41 160

原创 状态模式(State Pattern)

什么是状态模式一个糖果机的状态转换图如下所示: 如图,糖果机共有四种状态:有硬币、没硬币、售出糖果、糖果售罄,可以用四个常亮来表示四种状态,在糖果机类里定义投硬币、退硬币、转动曲柄、发糖果这四个动作的方法,这样,每个方法都要写与状态有关的if语句,确定在某个状态下某个动作的结果,但是这样的话,扩展起来很不方便,代码可维护性也低。可以定义一个状态接口,用四种状态类实现它,每个类实现需要的方...

2018-08-13 23:06:49 532

原创 迭代器模式(Iterator Pattern)与组合模式(Composite Pattern)

什么是迭代器模式正式定义迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。 把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。一个迭代器模式的结构一个聚合对象的接口,该接口中包含创建迭代器的方法,具体的聚合类实现该接口的创建迭代器方法,并返回一个迭代器对象;一个迭代器接口,包含next、hasNe...

2018-08-13 18:36:06 258

原创 模板方法模式(Template Method Pattern)

什么是模板方法模式正式定义模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。一个模板方法的实现:一个咖啡因饮料的准备方法: final void prepareRecipe(){ ...

2018-08-13 00:02:18 97

原创 适配器模式(Adapter Pattern)和外观模式(Facade Pattern)

什么是适配器现实中的适配器是把作为两个无法适配的设备之前的桥梁,把一个设备转化成另一个设备可以使用的设备,类似的,假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商所设计出来的接口,不同于旧厂商的接口,如果不希望改变代码,就可以写一个适配器类,将新厂商接口转接成你所希望的接口。适配器的正式定义 适配器模式是将一个类的接口,转换成客户期望的另一个接口,适配器让...

2018-08-12 21:15:31 280

原创 命令模式(Command Pattern)

命令模式概念命令模式图解说明类似于在餐馆点餐的过程,顾客类似于客户,他首先将菜单写好,发出命令对象(菜单),服务员(调用者)拿到菜单后将订单交给厨师(执行者),厨师执行的是订单中的内容,而与服务员是无关的。正式定义命令模式将请求封装成对象,以便使用不同的请求、队列或日志来参数化其他对象,命令模式也支持可撤销的操作。一个简单命令模式的实现(遥控器控制点灯开关)...

2018-08-12 17:00:09 168

原创 单件模式(Singleton Pattern)

为什么引入单件模式有些对象只需要一个,例如线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象、打印机和显卡等设备的驱动对象,这些对象只能有一个实例,如果有多个就会出现问题。如果用全局变量,那么必须在程序一开始就创建好对象,非常耗费资源,可以用单件模式,在需要时创建对象。单价模式的关键是保证一个对象只被实例化一次。单件模式分析下面是一个经典的单件模式类的实现:publ...

2018-08-12 02:25:12 107

原创 工厂(Factory)模式

为什么引入工厂模式按照面向对象的思想,利用接口(或抽象类)实例化一群具体的相关类时,要调用new方法,在运行时根据条件决定实例化的是哪一个类,这样的话,一旦有变化或扩展,就必须重新打开这段代码进行修改(例如有新的类型要实例化),相当于将很多鸡蛋放在一个篮子里,造成维护的困难。 这是一个相似的例子(假设这些类都实现了接口Book):Book book;if(comic) bo...

2018-08-12 01:36:24 245

原创 JAVA IO

Java I/O 层次结构根据I/O结构绘制思维导图如下: 输入流与输出流InputStream和OutputStream是两个抽象类,分别含义read()和write()抽象方法。InputStream:InputStream的作用是用来表示那些从不同数据源产生输入的类,这些数据源包括字节数组、String对象、文件、管道、一个由其它种类的流组成的序列、其它数据源。每一...

2018-08-09 03:20:41 136

原创 装饰者(Decorator)模式

装饰者模式的说明装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的设计方案。装饰者模式的特点装饰者和被装饰对象有相同的超类型;可以用一个或多个装饰者包装一个对象;在任何需要原始对象(被包装对象)的场合,可以用装饰过的对象代替它;装饰者可以在所委托被装饰者的行为之前与之后,加上自己的行为,以达到特定的目的;对象可以在任何时候被装饰,所以可以在运行...

2018-08-08 03:13:48 152

原创 观察者(Observer)模式

一、认识观察者模式类似于报纸订阅的过程: - 报社的任务就是出版报纸; - 向报社订阅报纸后,只要有新报纸出版,就会给客户送来。只要是客户,就会一直收到新报纸; - 当客户不想看报纸的时候,取消订阅,报社就不会送报纸过来; - 只要报社还在运营,就会有人向他们订阅报纸或取消订阅。将出版者改称为主题(Subject),订阅者称为观察者(Observer),则观察者模式具有以下特点:...

2018-08-08 00:22:27 163

原创 图相关(附相关算法JAVA源码)

一、相关定义图(Graph)由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。图中的数据元素称为顶点(Vertex)。V是有穷非空集合,不能是空集。顶点之间的逻辑关系用边来表示,边集可以是空的。无向图(Undirected graphs)无向边(Edge): 若两个顶点之间的边没有方...

2018-08-07 17:50:34 460

原创 最短路径(Dijkstra算法和Floyd算法)

一、含义非网图的最短路径是两顶点之间经过的边数最少的路径;网图的最短路径是指两顶点之间经过的边上权值之和最少的路径,并且称路径上第一个顶点是源点,最后一个顶点是终点。 本文主要讲网图的最短路径。二、迪杰斯特拉(Dijkstra)算法迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,算出源点到每一个点的最短距离,直到扩展到终点为止。代码示例://迪杰斯特...

2018-08-07 17:48:35 726

原创 拓扑排序与关键路径(AOV网和AOE网)

一、AOV网(Activity On Vertex Network)在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网。 不能存在回路。拓扑序列设G(V,E)是一个具有n个顶点的有向图,V中的顶点序列满足若从顶点v~i~到v~j~有一条路径,则在顶点序列中v~i~必须在v~j~之前,称这样的一个顶点为拓扑序列...

2018-08-07 17:47:20 1799

原创 图的遍历(DFS和BFS)

图的遍历是指从图中某一顶点出发,访遍图中其余顶点,且使每一个顶点仅被访问一次。一、深度优先遍历(Depth First Search)假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至...

2018-08-07 17:46:01 1383

原创 最小生成树算法(Prim和Kruskal算法)

在一个连通网图中,构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning Tree)。普里姆(Prim)算法步骤:生成树的点集为U,边集为Te,设初始点集合为图中任意一点u~0~,Te为空;在所有u∈U、v∈V-U的边(u,v)中找一条权值最小的边并入集合Te,同时该点并入集合U中;对每个点重复以上操作,直到U=V,此时Te即为最小生...

2018-08-07 17:44:29 195

原创 抽象类与接口

抽象类抽象类作为派生其他类的基类,而不作为特定的实现类,可以将通用方法放在继承关系高层次的抽象类中。创建抽象类使用abstract关键字,包含一个或多个抽象方法的类本身必须声明为抽象的。 除了抽象方法之外,抽象类还可以包含具体数据和具体方法。 抽象方法充当着占位的角色,它们的具体实现在子类中,扩展抽象类时,一种情况是在抽象类中定义部分抽象类方法或不定义抽象类方法,这样,必须将子类也声明为抽...

2018-08-06 02:25:25 174

原创 查找算法(附java源码)

一、顺序查找(Sequential Search) 顺序查找又叫做线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功;如果到最后一个记录还不相等,查找失败。时间复杂度: 最好的情况是O(1),最坏是O(n),平均为O(n)。二、折半查找(Binary Sear...

2018-08-03 22:01:00 175

原创 浅析树(附常用算法及JAVA实现)

树一、树的定义树(Tree)是n(n≥0)个结点的有限集。n = 0时称为空树。在任意一颗非空树中: (1)有且仅有一个特定的称为根(Root)的结点; (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T~1~、T~2~、……、T~m~,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 1.当n>0时,每棵树的根结点是唯一的; ...

2018-08-03 14:59:45 304

空空如也

空空如也

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

TA关注的人

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