Java 中的队列都有哪些,有什么区别
- ArrayDeque 数组双端队列
- PriorityQueue 优先级队列
- ConcurrentLinkedQueue 基于链表的并发队列
- DelayQueue 延期阻塞队列(阻塞队列实现类 BlockingQueue 接口)
- ArrayBlockingQueue 基于数组的并发阻塞队列
- LinkedBlockingQueue 基于链表的 FIFO 阻塞队列
- LinkedBlockingDeque 基于链表的 FIFO 双端阻塞队列
- PriorityBlockingQueue 带优先级的无界阻塞队列
- SynchronousQueue 并发同步阻塞队列
反射中,Class,forName 和 classLoader 的区别
Java 中 class.forName() 和 classLoader 都可用来对类进行加载。
class.forName() 前者除了将类的 .class 文件加载到 jvm 中之外,还会对类进行解释。执行类中的 static 块。而 classLoader 只干一件事,就是将 .class 文件加载到 jvm 中,不会执行 static 中的内容,只有在 newInstance 才会去执行 static 块。
Class.forName(name,initialize,loader)带参函数也可控制是否加载 static 块,并且只有调用了 newInstance() 方法采用调用构造函数,创建类的对象。
看下 Class.forName()源码
// Class.forName(String className) 这是 1.8 的源码
public static Class<?> forName(String className) throws ClssNotFoundException{
Class<?> caller = Reflection.getCallerClass();
return forName0(className,true,ClassLoader.getClassLoader(caller),caller);
}
// 注意第二个参数,是指 Class 被 loading 后是不是必须被初始化,不初始化就是不执行 static 的代码即静态代码
然后就是,测试代码证明上面的结论是 OK 的。如下
public class Line{
static{
System.out.println("静态代码块执行:loading line");
}
}
public class Ponit{
static{
System.out.println("静态代码块执行:loading ponit");
}
}
结论:
classloader 并没有执行静态代码块。而 Class.forName 则是执行了静态代码块。
可以看到,2 个类,line 和 ponit 的静态代码块执行结果是一起的,然后才是各自打印解雇哦。