-
管理Spring Bean的生命周期的注解
@PostContruct:
该注解被用来修饰唯一一个非静态的void()方法;
修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次;
在构造函数之后执行,init()方法之前执行.
@PreDestory:
被@PreDestory修饰的方法会在服务器卸载Servlet的时候运行,并且之后被服务器调用一次,类似于Servlet中的destory()方法,虽然PreDestory字面意思是在destory之前运行,但是被@PreDestory修饰的方法会在destory方法运行之后运行,在Servlet被彻底卸载之前,PreDestory里的Destory指的是Servlet的销毁,而不是destory()方法。
-
Spring AOP的实现方式
JDK动态代理,是Java提供的动态代理技术,可以在运行时创建接口的代理实例。
CGLib动态代理,采用底层的字节码技术,在运行时创建子类代理的实例。 -
JVM内存配置参数:
-Xmx:最大堆大小
-Xms:初始堆大小(最小堆内存)
-Xmn:年轻代大小
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值(例:XXSurvivorRatio=3表示Eden:Survivor=3) -
int型的比较Long也一样
-
Integer&Long&Float&Double
Integer (4字节32位)与 Long(8字节64位)
通过Integer a = 12;Long b = 12l;构造时会调用valueOf方法
且整型的数据默认使用int如果用Long则必须通过Long a = 12l的方式而不能使用L a = 12;
Float(4字节32位)Double(8字节64位)
浮点型的数据默认使用Double,通过Double a = 12.0的方式构造调用valueOf方法
浮点型数据默认使用Double若使用Float为防止精度不够需要使用Float a = 12.0f的方式。 -
Set
LinkedHashSet继承于HashSet、又基于 LinkedHashMap 来实现(按添加顺序排序);
TreeSet使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置(自然排序)。
HashSet无序不可重复; -
java相关的应用程序
javac.exe 编译.java文件
java.exe 执行编译好的.class文件
javadoc.exe 生成Java说明文档
jdb.exe Java调试器
javaprof.exe 剖析工具 -
类型比较、拆装箱问题
包装类的运算在不遇到算术运算的情况下不会自动拆箱;
包装类的equals()方法不处理数据转型;
包装类与基本数据类型时会自动拆包比较大小; -
父子类问题
构造函数:
子类无法继承构造函数,构造函数只能被显示或隐式的调用;
显示则通过super(),super(a),super(a,b…)调用。静态代码块、非静态代码块、构造函数执行顺序:
静态代码块是用来初始化类的信息,在类被加载的时候就会被执行,且只执行一次。
非静态代码块:是用来初始化类的实例信息,在创建对象的时候就会被执行,且每创建一个对象都会被执行一次且先于构造函数执行。
执行顺序:静态代码块(类加载时被执行1次)>非静态代码块(new 对象时执行)>构造方法 -
Synchronized和ThreadLocal
ThreadLocal类用于创建一个线程本地变量在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值就是变量的副本,ThreadLocal为每一个使用该变量的线程都提供了一个变量值的副本,每一个线程都可以独立地改变自己的副本,是线程隔离的。通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get方法之前要先set,否则就要重写initialValue()方法。ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。Synchronized和ThreadLocal的区别:
1、对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式.
2、Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
3、Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。一句话理解ThreadLocal,向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就只属于这个线程了。
使用场景:
ThreadLocal:在调⽤ API 接⼝的时候传递了⼀些公共参数,这些公共参数携带了⼀些设备信息(是安卓还是 ios),服务端接⼝根据不同的信息组装不同的格式数据返回给客户端。
Synchronized:
修饰普通方法:对当前对象实例加锁,调用该方法需要获得当前对象实例的锁
修饰静态方法:对当前类加锁,会对该类的所有实例加锁,因为静态方法不属于任何一个实例对 象,是属于类成员。所以当线程A访问调用一个实例对象的synchronized方法,线程B调用这个实例对象的 静态synchronized方法是允许的
修饰代码块:对指定的对象加锁,可以指定变量,也可以指定类,指定变量是需要获得该变量对应类的实例锁,由于基本类型不是对象,所以synchronized不可以修饰基本类型变量;指定类是需要获得当前类加锁



