java基础
文章平均质量分 66
Jerry的技术博客
天道酬勤; 事必总结
展开
-
Java比较器-Comparable和Comparator
Comparable This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class’s natural ordering, and the class’s compareTo method is r原创 2017-07-05 13:53:29 · 390 阅读 · 0 评论 -
CGLIB动态代理
CGLIB是强大的、高性能的代码生成库,被广泛应用于AOP框架,它底层使用ASM来操作字节码生成新的类,为对象引入间接级别,以控制对象的访问。CGLIB相比于JDK动态代理更加强大,JDK动态代理只能对接口进行代理,而CGLIB既可以代理普通类,也能够代理接口。CGLIB动态代理示例maven引入最新CGLIB包:<dependency> <groupId>c...原创 2018-12-02 19:11:28 · 638 阅读 · 0 评论 -
优先级队列
普通队列遵循先入先出原则,优先级队列支持基于队列元素的优先级进行处理,比如,银行中处理业务时需要优先处理大客户的业务等。Java 1.5中引入了优先级队列(PriorityQueue),这个优先级队列中的元素可以默认自然排序,也可以通过提供比较器在队列实例化时排序。优先级队列中队头是最小元素,当获取队列元素时,返回队头元素,如果多个元素有同样的排序值,则出队列时随机取其中一个。优先级队列不受限制...原创 2018-12-07 21:19:31 · 735 阅读 · 0 评论 -
Java transient关键字
Java中序列化是指将对象转换成字节序列的形式表示,这些字节序列包含了对象的数据和信息,序列化后的对象可以被写到数据库或文件中,也可以用于网络传输,Java序列化需要实体类实现Serializable接口。序列化后的字节序列可以恢复成Java对象,这个过程称为反序列化。在实际开发过程中,对象的一些属性需要被序列化,另外一些不需要被序列化,比如用户的依稀敏感信息(如:密码,银行卡号等),为了安全起...原创 2018-12-09 09:25:15 · 230 阅读 · 0 评论 -
AbstractQueueSynchronizer-简介
一、简介Java同步器AbstractQueuedSynchronizer简称AQS,JDK中很多并发工具类的内部实现都依赖于AQS,如ReentantLock、Semaphore、CounDownLatch、ThreadPoolExecutor等。AQS的设计基于模板方法模式,实际开发中需要继承AQS并重写指定的方法,将其组合在并发组件的实现中,而AQS在模板方法中封装了同步状态管理、线程排队...原创 2019-01-27 15:47:28 · 223 阅读 · 1 评论 -
AbstractQueueSynchronizer-独占式获取与释放
一、独占式锁实现及应用按上一篇文章的介绍,创建一个写锁类,用于对资源独占式的写访问,如下。写锁类中核心是创建了继承自AQS的内部类,并重写tryAcquire和tryRelease方法;写锁类实现锁接口,并创建同步器成员变量,为简便起见主要实现了Lock接口中的lock和unlock方法。public class TestWriteLock implements Lock { pri...原创 2019-01-27 20:52:57 · 352 阅读 · 0 评论 -
AbstractQueueSynchronizer-共享式获取或释放
一、共享式锁实现及应用上一篇文章分享了独占式获或释放同步状态的过程。本文分享AQS共享式获取或释放同步状态,共享式获取或释放过程与独占式获取或释放过程大体相同,按照相同流程进行分析。首先,创建一个读锁类,用于对资源的共享式读访问,其核心是创建继承自AQS的内部类,并重写tryAcquireShared和tryReleaseShared方法。读锁类实现锁接口,并创建同步器成员变量,为简便起见主要实...原创 2019-02-03 16:43:49 · 208 阅读 · 0 评论 -
Java传值调用和传引用调用(参数引用为null的问题)
一、问题近期在项目中遇到一个场景,在多层级调用中需要传递上下文,调用过程中上线文对象可能为空,想通过一个公共方法处理上下文,当上下文为空时生成上下文对象,执行相关操作后将该上下文对象向后传递。大致逻辑如下:public class Test { public static void handleContext(Context context) { if(context...原创 2019-05-15 20:58:33 · 7152 阅读 · 0 评论 -
Java SPI简介、示例及实现源码分析
一、什么是SPISPI(Service Provider Interface)是JDK内置的一种服务发现机制,简单说它就是一种动态归还发现的机制,比如一个接口,想运行时动态给它添加实现,只需要添加一个实现,然后在jar包src/resources/META-INF/service目录下创建一个接口全限定名的文件,文件中存放实现类的全限定名,允许存多个实现类全限定名二、SPI使用示例2.1 ...原创 2019-06-08 14:24:47 · 648 阅读 · 0 评论 -
Java8日期/时间使用
一、名词时间戳(时刻):时间戳是指格林尼治时间1970年01月01日00时00分00秒到现在的总秒数(毫秒数),可以理解成绝对时间,它与时区无关,不同时区对同一时间戳的解读不一样时区:同一时刻(时间戳),世界上各地区的时间可能是不一样的,具体时间与时区相关,按经度一共分为24个时区,英国格林尼治是0时区,中国北京是东8区二、Java8时间2.1 Java8时间Java1.0版本时...原创 2019-06-10 15:44:25 · 8029 阅读 · 2 评论 -
JDK动态代理
代理是一种常用的设计模式,其目的是为其他对象提供一个代理可以控制对某个对象的访问,代理类负责为委托类预处理消息、过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理分为静态代理和动态代理,静态代理是在编译期间进行代理操作,动态代理是在程序运行期间进行代理操作。本文简要介绍动态代理技术。动态代理技术分为两类:Java JDK动态代理和CGLIB动态代理,前者是基于反射技术实现,后者基于继...原创 2018-11-19 22:45:28 · 205 阅读 · 0 评论 -
Java7 try-with-resource
在Java编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等),我们必须在资源使用完后手动关闭他们,因为外部资源不由JVM管理,无法被JVM垃圾回收器回收,外部资源没有正确关闭将会导致资源泄露,将会导致文件被异常占用,数据库连接过多导致连接池满等问题。为了确保外部资源被正常关闭,通常关闭代码被写入finnaly代码块中,我们还必须注意到关闭资源时可能抛出的异常,如下: public ...原创 2018-11-14 21:07:52 · 1103 阅读 · 0 评论 -
一种Java通用的FeatureMap存取设计
一、map存取任意对象 首先,定义map对象,将map的value类型指定为Object,它可以存储任意基础类型或自定义类型的值对象。由于值类型为Object,在读取map元素时,往往需要将值强制转换为需要的类型。其实,可以返回值类型为范型优化代码,将类型转换前置到get方法中,如下:/**二、通用FeatureMap存取设计 基于以上CoMap存在的问题,对该CoMap类进行优化,主要在两方面:1.对map原创 2017-07-23 16:57:16 · 775 阅读 · 0 评论 -
String.compareTo()方法用于版本号比较的坑
最近项目中需要比较客户端版本,项目之初使用String.compareTo()方法进行版本比较,客户端版本如:8.2.3,各级版本号都为数字且以’.’分割,当某一级别版本号大于等于10时,String.compareTo()方法返回错误。一、String.compareTo()比较版本号 通过String.compareTo()比较不同的版本号,结果如下:public class Test {原创 2017-08-26 18:00:45 · 2965 阅读 · 2 评论 -
Java嵌套类与内部类
嵌套类是任意声明在另一个类或接口中的类,最外层的类不是嵌套类。按照嵌套类声明位置不同,可以将嵌套类分为三种:成员嵌套类(member nested class)、局部嵌套类(local nested class)、匿名嵌套类(anonymous nested class)。另一方面,通常可将嵌套类分为两种:静态嵌套类和内部类原创 2017-10-08 17:01:22 · 6715 阅读 · 1 评论 -
Guava谓词函数 - Predication&Predications
Predicate是Guava提供的基础接口,该接口包含一个带有泛型参数的方法,该方法输入一个范型,输入一个布尔值,是一个典型的谓词函数(谓词函数:输入一个对象,返回true或者false),定义如下:public interface Predicate<T> {... boolean apply(@Nullable T input);...}采用谓词函数的思想,利用传入到函数内的谓词原创 2017-11-06 00:07:38 · 934 阅读 · 0 评论 -
HashMap源码分析
一、HashMap的get()方法在java中的工作原理哈希相关的数据结构本质上都是键值对(key value pair),HashMap的工作原理是利用哈希(散列),用put()方法和get()方法来存储和检索HashMap对象。 Hash table based implementation of the Map interface. This implementation ...原创 2018-06-29 16:46:46 · 129 阅读 · 0 评论 -
Java Type应用
一、fastjson解析参数化类型对象先看一个使用fastjson解析参数类型对象的例子:public static void main(String ... args) { String personString = "[{\"id\":1,\"name\":\"Irene\",\"password\":\"123456\"},{\"id\":2,\原创 2018-07-10 19:53:43 · 491 阅读 · 0 评论 -
什么是AOP & AspectJ AOP
一、为什么要用AOP?什么是AOP?为什么要用AOP? 面向对象的特点是继承、封装和多态,而封装要求将功能分散到不同的对象中,伴随着业务系统越来越复杂,我们的核心业务中会参杂一些特殊业务,比如日志记录、权限验证、性能检测、错误检测等,这些外围操作会带来核心业务代码混乱、重复冗余逻辑散布、代码扩展困难等种种问题。 我们希望这些模块能够具有热插拔特性,而不需要将这些外围代码入侵到核心...原创 2018-08-03 16:50:52 · 1140 阅读 · 0 评论 -
Java8 Lambda表达式
lambda表达式是java8提供一个重要的特性,它提供了一个正常的参数列表和一个使用这些参数的主体,它必须依附于一个特别的对象类型–函数式接口,lambda表达式语法为:(parameters) -> expression(parameters) -> {statements}一、函数式接口如果在一个接口中有且只有一个抽象方法,那么这个接口就可以当做函数式接口。Java8引...原创 2018-11-12 20:34:09 · 328 阅读 · 0 评论 -
Java8 CompletableFuture使用
一、Future接口1.1 Runnable与CallableRunnable接口源自JDK1.1,它只有一个run()方法,该方法没有返回结果:public interface Runnable { public abstract void run();}Callable接口是JDK1.5中添加,只有一个call()方法,该方法支持结果返回且可以抛出异常:public ...原创 2019-07-08 21:19:04 · 1087 阅读 · 0 评论