Java基础之集合实现类

282 阅读1分钟

Java 中的队列都有哪些,有什么区别

  1. ArrayDeque 数组双端队列
  2. PriorityQueue 优先级队列
  3. ConcurrentLinkedQueue 基于链表的并发队列
  4. DelayQueue 延期阻塞队列(阻塞队列实现类 BlockingQueue 接口)
  5. ArrayBlockingQueue 基于数组的并发阻塞队列
  6. LinkedBlockingQueue 基于链表的 FIFO 阻塞队列
  7. LinkedBlockingDeque 基于链表的 FIFO 双端阻塞队列
  8. PriorityBlockingQueue 带优先级的无界阻塞队列
  9. 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 的静态代码块执行结果是一起的,然后才是各自打印解雇哦。