数组全排列算法非递归实现

全排列还是挺有点意思的,看起来很简单,做起来挺复杂的,除了之前的递归方式之外,研究下非递归实现

比如输入数组为arr = {2, 1, 3},那么简单可以通过下面几步计算全排列

1、arr先进行排序,从小到大,排序后{1, 2, 3}

2、从右往左,找到第一个i,使得arr[i] < arr[i+1],那么在arr[i+1:len]里找出一个最小的arr[min] > arr[i],然[……]

Read more

数组全排列算法递归处理

原题是提供一个数组,列出所有数字组成的全排列,排序后,进而随便提供一个index,能够逆向输出第index个排列

比如数组nums={1, 2, 3},那么全排列排序后结果为:[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

因此,完成流程有三个步骤:

1、nums求全排列

2、全排列排序保存起来

3、返回倒数in[……]

Read more

Java类的加载机制

1、什么是类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类加载器并不需要等到某个类被“首[……]

Read more

Java CGLIB动态代理

JDK InvocationHandler的动态代理是基于接口来实现的,从newProxyInstance()方法中的参数也可以看出来,假如被代理的对象的类并没有实现接口,而是一个普通的类,那么久可以通过CGLIB动态代理来实现

了解了JDK动态代理之后,再来理解CGLIB相对容易一些,大致流程

1、通过CGLIB的Enhancer对象注入被代理类和方法属性,进而调用create()方法来创建代理[……]

Read more

Java JDK动态代理

到处都是用的动态代理,这次是认真的

静态代理:事先已经知道了要代理什么,而且编译时代理类就已经生成

动态代理:事先不知道要代理什么,运行的时候才能确定,实现InvocationHandler接口,调用Proxy的newProxyInstance()方法通过反射动态地创建代理类

下图就是创建代理类的流程

图来自:https://upload-images.jianshu.io/upload_ima[……]

Read more

Spring操作Redis数据库,RedisTemplate和StringRedisTemplate差异

Redis是KV内存数据库,支持很多数据结构,具体如下面之前写过的,也可以自行google

http://lihuia.com/?s=redis

Spring对Redis操作的支持,基本也和JDBC,MongoDB类似,通过Spring Data Redis,具体有

1、客户端支持,Jedis和Lettuce

2、RedisTemplate

3、Repository支持

测试一下通过Jedis来操[……]

Read more

Spring MVC:Tomcat,Servlet,Spring

最近迷上了tomcat,小研究了下多层容器结构,下图来自互联网

Spring MVC相关的内容,一些基本的概念,转载几个讲解的部分内容学习一下

web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。其中spring控制service层和dao层的bean对象。springmvc容器控制controller层bean对象。servlet容器[……]

Read more