自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (4)
  • 收藏
  • 关注

原创 NIO(JDK1.4)--选择器Selector

先看下面例子:public class SelectSockets {    private ByteBuffer buffer = ByteBuffer.allocateDirect(1024);    public static void main(String[] argv) throws Exception {        new SelectSock

2015-08-19 19:16:58 359

原创 NIO(JDK1.4)--缓冲区

基础1、缓冲区API:让我们来看一下可以如何使用一个缓冲区。以下是Buffer类的方法签名:package java.nio;  public abstract  class  Buffer {          public final  int  capacity(  )          public 

2015-08-19 16:24:40 327

原创 八皇后问题-回溯法

8皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。因为不能同行同列,所以每行、每列有且仅有一个棋,思路如下:逐个象棋摆放,第i个象棋摆放在第i行,摆放每个象棋时,从第一列开始,尝试放入,一旦满足放入条件便放入该象棋,然后再放下一个象棋,如果无法放入,则回到第i-1个象棋,从新摆放第i-1个象棋,如果第i

2015-08-15 14:06:40 383

原创 适配器模式

类的适配器模式假如需要使用程序中现有的某个类,且该类的接口不符合需求,但该类已经实现好了,为了不影响原有程序,不便对该类本身修改,这时可以用一个新的类继承原来的类,然后在新的类中去重载原来类的某些方法或添加一些新的方法。代码如下:原有的类:public class Person {      private String name;      private Strin

2015-08-12 14:32:43 314

原创 策略模式

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。下面例子采用策略模式实现加减乘除四种运算:public interface Operation {    publicvoid o

2015-08-12 14:32:18 283

原创 六大原则

单一职责原则定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理

2015-08-12 14:31:19 354

原创 合成复用原则

合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下:合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委

2015-08-12 14:30:36 945

原创 工厂模式之工厂方法模式

先看代码:publicinterface Product {   publicvoid getName();}publicclass AProduct implements Product{   publicvoid getName() {      System.out.println("I am product A");   }}

2015-08-12 14:29:56 444

原创 工厂模式之抽象工厂模式

场景问题  举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU、硬盘、内存、主板、电源、机箱等。为讨论使用简单点,只考虑选择CPU和主板的问题。  事实上,在选择CPU的时候,面临一系列的问题,比如品牌、型号、针脚数目、主频等问题,只有把这些问题都确定下来,才能确定具体的CPU。  同样,在选择主板的时候,也有一系列问题,比如品牌、芯片组、集成

2015-08-12 14:29:28 1164 1

原创 状态模式

状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像是改变了它的类一样。状态模式的结构用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其

2015-08-12 14:28:00 518

原创 代理模式

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。一般涉及到的角色有:抽象角色:声明真实对象和代理对象的共同接口,为什么要继承这么一个抽象类(或接口),原因是为了保证代理对象提供足够的方法调用真实对象(至少要实现接口的所有抽象方法,否则实例化的时候会报错)代理角色:代理对象角色

2015-08-12 14:27:19 347

原创 最长回文子串

回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。回文子串,顾名思义,即字符串中满足回文性质的子串。比如输入字符串 "google”,由于该字符串里最长的对称子字符串是 "goog”,因此输出4。解法一:分别求以每个字符或每两个字符为中心的回文子串长度,由于子字符串的长度可能是奇数也可能是偶数。长度是奇数的字符串是从只有一个字符的中心向两端延长出来,

2015-08-12 14:20:00 570

原创 与数字相关算法

丑数问题描述:我们把只包含因子(因子都是质数,合数不叫做因子)2、3、5的数称为丑数,如6、8都是丑数,14不是丑数,因为14包含因子7,习惯上1也是丑数。求出1到1500之间的所有丑数。思路:解法一:逐个判断是不是丑数,时间复杂度比较大从丑数的定义可知,如果一个数是丑数,那么该数一定能被2、3、5整除,故判断一个数m是不是丑数,可以通过执行下面操作来完成:

2015-08-12 14:17:25 1132

原创 动态规划

动态规划的关键是找出一条关系表达式,然后根据该表达式循环或递归。往往需要把一些中间状态保存下来,避免重复计算。数字三角形有一个由正整数组成的三角形,第一行只有一个数,除了最下行之外 每个数的左下方和右下方各有一个数。从第一行的数开始,每次可以往左下或右下走一格,直到走到三角形底端,把沿 途经过的数全部加起来作为得分。如何走,使得这个得分尽量大?如图:

2015-08-12 14:15:46 668

原创 与数组相关算法

找出递增数组中和为s的两个数问题:已知一个递增排序的数组和一个数字s,在数组中找出两个数,使它们的和正好等于s,找出任意一对便可。思路:普通解法:第一个数从数组的开头开始,然后利用二分法找第二个数,时间复杂度为nlogn,因为第一个数是从头到尾顺序选择的。时间复杂度为n的解法:第一个数从数组的开头开始,第二个数从数组的结尾开始,如果两者的和大于s,则第二个数往前取下一个

2015-08-12 14:14:19 3296

原创 图算法

图的基本算法图的表示1、邻接表2、邻接矩阵这两种方法都可表示有向图和无向图,邻接表适合表示稀疏图、邻接矩阵不管有多少条边,它需要的空间都是n*n,所以适合表示稠密图。如果经常需要判断两个给定顶点是否存在边,适合用邻接矩阵,因为邻接表需要从某点出发沿着链表一个个搜看是否找到另一个点,但邻接矩阵可以一下子定位到某个坐标,如[i,j]如果为1表示i与j有边相连。广度优先搜索利用队

2015-08-12 14:12:56 3426

原创 贪心法

几个简单的例子最优装载问题:给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总重量不超过C。由于目标是物体的数量尽量多,所以装重的没有装轻的划算。只需把所有物体 按重量从小到大排序,依次选择每个物体,直到装不下为止。这就是一种贪心法,因为每次都是选择能装下的最轻的物体,是一种“只顾眼前”的策略。与动态规划中的01背包问题不同。部分背包问题:有n个物体,第i个物体

2015-08-12 14:11:38 612

原创 二项树与二项堆

二项树二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两个子树Bk-1连接而成:其中一棵树的根是另一棵树的根的最左孩子。二项树Bk具有以下性质:1)共有2的k次方个结点2)树的高度为k3)在深度i处恰有k的i组合个结点,其中i=0,1,...,k4)根的度数为k,它大于任何其他结点的度数,并且,如果对根的子女从左到右编号为k-1,k-2,...,

2015-08-12 14:10:44 2739

原创 斐波那契数列、堆

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144第0项是0,第1项是第一个1。这个数列从第二项开始,每一项都等于前两项之和。在数学上,斐波纳契数列被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)性质:1、斐波那契数列又称黄金分割数列,原因是当n趋于无穷大时,

2015-08-12 14:10:03 1323

原创 树--红黑树

红黑树性质:红黑树是每个节点都带有颜色属性的二叉查找树(有序二叉树),颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树还需满足下面要求:1、节点是红色或黑色。2、根节点是黑色。3、每个叶节点(NIL节点,空节点)是黑色。4、每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点),黑色节点的子节点可以是红色也可以是黑色。5、从任

2015-08-12 14:09:04 359

原创 Java内存模型

内存模型的抽象在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local variables),方法定义参数(java语言规范称之为formal method parameters)和异常处理器参数(exception handler parameters)不会在线程之间共享,它们不会

2015-08-12 14:06:36 367

原创 垃圾回收

Java的垃圾回收机制是Java虚拟机(JVM)提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身。垃圾回收的是堆中的内存,而不是栈中的内存!!System.gc() 或Runtime.getRuntime().gc() 上面的方法调用时用于显式通知JVM可以进行一次垃圾回收

2015-08-12 14:05:21 355

原创 内存管理

java虚拟机运行时的数据区程序计数器:占内存空间很小,每条线程有一个独立的程序计数器(软件上的计数器,不是指硬件的计数器),用于记录执行到的位置,这样线程切换后可以恢复到正确的执行位置。如果正在执行的是Native方法,则该计数器的值为0。虚拟机栈:虚拟机栈也是线程私有的,生命周期与线程相同,每个方法被执行时都会创建一个栈帧用于存储局部变量、操作数栈、动态

2015-08-12 14:03:32 316

原创 异常与错误

程序的错误可以抽象分为三类:语法错误、运行错误和逻辑错误语法错误是指由于编程中输入不符合语法规则而产生的。程序编译就通不过,程序不能运行起来。此类错误最简单,调试起来比较容易。例如:表达式不完整、缺少必要的标点符号、关键字输入错误、数据类型不匹配、循环语句或选择语句的关键字不匹配等。通常,编译器对程序进行编译的过程中,会把检测到的语法错误以提示的方式列举出来,又

2015-08-11 14:15:33 797

原创 CountDownLatch与CyclicBarrier

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。latch也即闭锁的意思,CountDownLatch是闭锁的一种实现,FutureTask也可以实现闭锁。CountDownLatch类只提供了一个构造器:

2015-08-11 13:07:13 476

原创 类(静态)方法使用

public class Test {    public void method1(){}    public void method2(){        this.method1();//正确        method1();//正确        staticMethod1();//正确    }    public static void staticMet

2015-08-08 14:02:21 426

原创 Serializable序列化

对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) 。Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时

2015-08-08 13:59:53 370

原创 国际化

java.lang.Locale类获得此Java虚拟机当前线程默认的语言环境值:Locale defaultLocale = Locale.getDefault();获取当前Java虚拟机线程默认的国家和语言信息:String country = defaultLocale.getCountry();//返回国家地区代码String language = defau

2015-08-08 13:59:00 336

原创 获得当前时间

获得当前时间戳:1、new Date().getTime()2、System.currentTimeMillis()3、Calendar calendar = Calendar.getInstance();     calendar.getTimeInMillis()获得当前时间:Calendar calendar = Calendar.getInstance();

2015-08-08 13:55:57 336

原创 算术符优先级

优先级从大到小如下:1、~按位取反运算符,如:~2等于~00000010,取反后得11111101,即-32、*、/、%、+、-3、位移运算符:>>左移、4、==、!=5、|或、&与、^异或6、+=、-=、*=例1:a=6;b=4;求a^b例2:int a = 1;int b = 2;if(a&b==2)    print

2015-08-08 13:53:01 781

原创 随机数、唯一字符串

java.util.Random类在Java中我们可以使用java.util.Random类来产生一个随机数发生器。它有两种形式的构造函数,分别是Random()和Random(long seed):Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(long seed)使用指定的seed作为发生器的种子。随机数发生器(Ra

2015-08-08 13:49:17 1984

原创 Java自带排序方法

Collections.sort(List list)该方法是升序排序,方法的内部采用了快排实现,但该方法是稳定的。除Integer、Float、Double、String等Java自带类型外,list里的所有元素必须实现Comparable接口的compareTo方法。例子:class Bean implements Comparable{      public

2015-08-08 13:47:59 7266

原创 复制文件(夹)

文件复制:原始方法(实际上也是用nio来操作的):1、一次性读取      FileInputStream fis = new FileInputStream("D:\\test.jpg");      FileOutputStream fos = new FileOutputStream("D:\\test1.jpg");      int n = fis.a

2015-08-08 13:44:25 341

原创 考虑用静态工厂方法替代构造器的情况

考虑用静态工厂方法替代构造器原来创建一个自定义类的实例最常用的方法是采用构造器,但一个类可以有多个构造器,而所有的构造器名字都相同,我们只能通过参数来区分不同构造器的作用。除了采用构造器外,还可以采用静态工厂方法,该方法返回类的实例便可,自定义的方法可以自己命名,这样一来就很容易区分每个方法的作用了。例子:publicclass CreateObject {   int

2015-08-08 13:40:49 512

原创 利用log4j写日志

1、下载导入包commons-logging.jar和log4j-1.2.9.jar2、写配置文件log4j.properties,内容如下:log4j.rootCategory=INFO, LOGFILE     //LOGFILE表示将日志写到文件中,如果是CONSOLE则将日志写到控制台log4j.logger.org.apache.axis2.enterprise=FA

2015-08-08 13:22:44 2345

原创 强、弱、软、虚引用

在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利

2015-08-08 13:19:11 445

原创 虚拟机加载机制

java中的类并不是在运行或编译时就被初始化的,而是在运行的过程中需要的时候才被初始化,一个类的生命周期包括下面7个阶段:加载->验证->准备->解析->初始化->使用->卸载其中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,“解析”可能在初始化之前或之后进行,“使用”应该也能在初始化之前或之后进行。类何时被初始化一个类当且仅当在下面4种情况之一发生时才

2015-08-08 13:18:50 343

原创 方法分派

可以从两方面划分:静态分派及动态分派单分派及多分派静态分派及动态分派静态分派:先来看一段代码:public class StaticDispatch {    public void sayHello(Human guy) {        System.out.println("hello, guy!");    }  

2015-08-08 13:17:19 558

原创 类加载器

JVM预定义的三种类型类加载器:启动(Bootstrap)类加载器:是用native实现的类装入器,它负责将 /lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc

2015-08-08 13:16:34 352

原创 取消与关闭

任务取消(cancel)若外部代码能在某个操作正常完成之前将其置入“完成”状态,则该操作是可取消的。取消操作的原因:       1. 用户请求取消。       2. 有时间限制的操作,如超时设定。       3. 应用程序事件。       4. 错误。       5. 关闭。 如下面这种取消操作实现:/** * 一个

2015-08-08 13:07:31 2014

空空如也

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

TA关注的人

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