5、Java的队列都有哪些,有什么区别
Queue接口:FIFO的数据结构,继承了Collection接口。
1.未实现阻塞接口的:
-
LinkedList:实现Deque接口,Deque接口继承Queue,但是底层是链表。
-
PriorityQueue : 优先队列,本质维护一个有序列表。可自然排序亦可传递 comparator构造函数实现自定义排序。
-
ConcurrentLinkedQueue:基于链表,线程安全的队列。增加删除O(1) 查找O(n)
2.实现阻塞接口的:
实现blockqueue接口的队列,其特点:线程阻塞时,不是直接添加或者删除元素,而是等到有空间或者元素时,才进行操作。
- ArrayBlockingQueue:一个由数组支持的有界队列。
- LinkedBlockingQueue:一个由链接节点支持的可选有界队列。
- ProiporityBlockingQueue:一个由优先级堆支持的无界优先级队列。
- DelayQueue:一个由优先级堆支持的、基于时间的调度队列。
- SynchronousQueue:一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
6、反射中,Class.forName和ClassLoader的区别
双亲委派机制:
JVM提供三层的ClassLoader:
- Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
- ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
- AppClassLoader:主要负责加载应用程序的主函数类。
当一个class文件要加载到 JVM 时,会看自己是否已经加载了这个类,如果已经加载则返回,如果没有就会委托父加载器,如果父加载器已经加载,就成功返回,否则以此类推,当到达最顶层都没有加载该类时,才会自己(最开始的类)去加载。
优点:
1.防止重复加载同一个.class,浪费资源的同时也会导致数据不安全。
2.防止核心的.class被恶意篡改,如String.class,使用这种机制后,Bootstrap classLoader已经加载过了,所以就不会再去加载,从一定程度上防止危险代码植入。