臧克家-幻光.md


臧克家

. . .

人生永远追逐着幻光,

但谁把幻光看作幻光,

谁便沉入了无底的苦海。

Java排序之Comparable与Comparator

平时我们在对集合或数组排序时,会碰到Comparable和Comparator这两个很类似的接口,它们以不同的方式实现了元素的排序功能,今天我们就来谈谈这两个接口的区别,并介绍下Java排序一些常见方法的使用。

首先介绍一下Comparable与Comparator的区别。

Comparable是排序接口,若一个类实现了Comparable接口,该类的对象就支持排序;

而Comparator是比较器接口,我们可以实现一个Comparator接口(一般采用匿名内部类的写法),定义一种对A类的排序规则,而不需要对A类做任何改变。

所以,Comparable相当于内部比较器,而Comparator相当于外部比较器。

下面列出集合排序时一些常用的方法:

  • list.sort(comparator)
  • Collections.sort(list)
  • Collections.sort(list, comparator)
  • list.stream().sorted();
  • list.stream().sorted(comparator)

可以发现有的排序方法要求提供Comparator接口作为参数,有些则没有要求;

若提供了Comparator接口,则集合的元素无需实现Comparable接口,若元素没有实现Comparable接口,则需要提供Comparator接口。

Read More

Spring IOC和AOP必知必会

  • Spring-IOC
  • Spring-AOP
  • JDK动态代理
  • BeanPostProcessor实现自定义注解

Spring-IOC

所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系,而不是传统的手动去控制对象的创建。

从配置上来说,相当于把代码中的依赖关系转移到xml配置文件中。

优点:通过使用IOC,再加上Spring提倡的面向接口编程,能很大程度实现组件之间的解耦,利于功能复用,最终提高了项目整体的灵活性和可维护性。

DI(依赖注入)其实就是IOC的另外一种说法,IoC容器动态的向某个对象提供它所需要的其他对象。

Spring-AOP

AOP:Aspect Orient Programming,面向切面编程;用来处理具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。

使用场景:

  • Authentication 权限
  • Caching 缓存
  • Context passing 内容传递
  • Error handling 错误处理
  • Lazy loading 懒加载
  • Debugging 调试
  • logging, tracing, profiling and monitoring  记录跟踪 优化 校准
  • Performance optimization 性能优化
  • Persistence 持久化
  • Resource pooling 资源池
  • Synchronization 同步
  • Transactions 事务

AOP分类:

  • 静态AOP实现:AspectJ,编译阶段修改
  • 动态AOP实现:Spring AOP,底层使用JDK动态代理或cglib

基本概念:

  • Aspect -切面
  • Joinpoint -连接点
  • Advice -增强处理
  • Pointcut -切入点

    Read More

Hibernate缓存机制与Spring缓存框架的区别与联系

  • Hibernate一级缓存
  • Hibernate二级缓存
  • Spring缓存机制
  • Hibernate缓存与Spring缓存的比较

Hibernate一级缓存

一级缓存是Session级别的缓存(即当前Session有效),默认启用。

一级缓存的key为ID(主键)。

当执行load/get/list/iterator/save/update/saveOrUpdate等方法时会把得到的实体对象放入一级缓存中(只支持实体对象缓存,不支持属性的缓存),之后在同一个session范围内执行load/get/iterator等查询语句(不包括list)查询缓存过的数据时,Hibernate不会去数据库中查询。

当程序保存或修改实体时,不会立即同步到数据库,而是保存在一级缓存中,只有程序显示调用Session的flush()或close()方法才会刷新至数据库,这样可以减少数据库的交互,提高数据库的访问性能。

一级缓存清除方法:

  • contains(object obj)
  • evict(Object obj)
  • clear()

    Read More

关于单例模式你应该知道的

单例模式

使用场景:

  • Hibernate使用时只需要一个SessionFactory
  • 在Spring中,指定scope=”singleton”则bean为单例(不指定也默认单例)
  • 业务逻辑组件、DAO组件、数据源组件都是单例,因为它们无需保存用户的状态
  • 数据连接池使用单例模式,无需创建多个

优势:

  • 减少创建对象带来的系统开销
  • 便于管理单个对象的生命周期

写法:

  • 懒汉式,即Lazy Loading,什么时候用什么时候初始化,需要考虑线程同步
  • 饿汉式,即在类装载的时候就完成实例化,避免了考虑线程同步

第一种:饿汉式,线程安全

1
2
3
4
5
6
7
8
9
10
public class Singleton {

private final static Singleton singleton = new Singleton();

private Singleton(){}

public static Singleton getInstance(){
return singleton;
}
}

Read More