Java

【算法学习】二分查找算法

二分查找算法用于在一列已排序的数组中找出一个数的位置。 假设下面有一列已排序的数:[a1,a2,a3,a4,...an],有a1<=a2<=a3<=a4<=...<=an 当我们要查询一个数a是否在数组中,直接的办法就是一个个比对,找到了即返回所在位置,没找到就返回-1;这种方法的时间复杂度是O(n)。 设有n个数,二分查找是先找数组[1..n]中间的那个数M,设其位置为i 1. 如果a比M小,则a肯定在M的左边,下一轮查数组[1..i-1]; 2. 如果a比M大,那a肯定在M的右边,

  • zgljl2012
1 min read
设计模式

Java动态代理的异常处理问题

今天在使用Java动态代理时出现了一个很棘手的问题,实现类里抛出了一个自定义异常,但外面捕获不到。 虽然使用printStack可以输出调试信息,但通过getMessage获取不到提示,因为项目需求是捕捉到同一种自定义异常的不同异常情况,通过 getMessage获取异常提示反馈给用户,但因为使用了动态代理所以出现了异常捕获不到的情况。 具体原因是因为我们通过动态代理最终捕获到的异常时经过加工了的,也就是捕获的已不再是最开始我们希望抛出的异常,加工抛出的异常有两种: java.lang.reflect.UndeclaredThrowableException java.lang.reflect.InvocationTargetException 经过实验,最终的解决办法为: 在动态代理的方法执行时捕获异常,然后抛出exception.getCause() 这样,就能抛出你所希望抛出的那个异常里。 try{ method.invoke(fun, args); } catch(

  • zgljl2012
1 min read
Java

【Java基础】InputStream 、 InputStreamReader和BufferedReader

在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法。 * InputStream : 是所有字节输入流的超类,一般使用它的子类:FileInputStream等,它能输出字节流; * InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符; * BufferedReader : 提供通用的缓冲方式文本读取,readLine读取一个文本行, 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 下面有三个Demo(Demo访问百度主页获取字节流然后输出)来分别说明三个类的作用: -------------------------------------------------------------------------------- * InputStream package 数据流; import java.io.IOException; import java.

  • zgljl2012
4 min read
Java

Java正则表达式实现${name}形式的字符串模板

在开发中类似站内信的需求时,我们经常要使用字符串模板,比如 尊敬的用户${name}。。。。 里面的${name}就可以替换为用户的用户名。 下面使用正则表达式简单实现一下这个功能: /** * 根据键值对填充字符串,如("hello ${name}",{name:"xiaoming"}) * 输出: * @param content * @param map * @return */ public static String renderString(String content, Map map){ Set

  • zgljl2012
1 min read
设计模式

动态代理

代理模式是设计模式中一个非常重要的模式,代理模式有两个角色,一个是代理类,一个是委托类,委托类也是真正的业务类,两者都有相同的接口; 代理类主要负责为委托类预处理消息、过滤消息、把消息转发 给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象并不真正实现服务,而是通过 调用委托类的对象的相关方法,来提供特定的服务。 Spring中的AOP基本原理就是动态代理。 代理模式可以根据代理类创建时期的不同分为两种: * 静态代理:程序员需要编写特定的源代码,在程序运行前,.class已存在 * 动态代理:在系统运行时,Java反射自动生成 静态代理就不记录了,值得好好学学的是动态代理。学习动态代理首先要学一下Java反射,它的实现常见的有两种: * JDK提供的InvocationHandler 接口和java.lang.

  • zgljl2012
8 min read
zgljl2012@gmail.com