Java类加载器面试题集锦

前言

程序在启动的时候,并不会一次性加载程序所要用的全部class文件,而是根据程序的须要,经过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存以后,才能被其它class所引用。因此ClassLoader就是用来动态加载class文件到内存当中用的。面试

  • Java 8集合中的Stream至关于高级版的Iterator
  • Stream API经过Lambda表达式对集合进行各类很是便利高效的聚合操做,或者大批量数据操做
  • Stream的聚合操做与数据库SQL的聚合操做sorted、filter、map等很是相似
  • 在数据操做方面,Stream不只能够经过串行的方式实现数据操做,还能够经过并行的方式处理大批量数据,提升处理效率

Java集合的根接口是Collection,它又继承了迭代接口Iterable List接口和Set接口继承了Collection接口 Map接口是独立的接口,并无继承Collection接口 (这里是重点,面试可能问的比较多) List接口经常使用的实现类有:ArrayList、LinkedList、Vector Set接口经常使用的实现类有:HashSet、LinkedHashSet、TreeSet Map接口经常使用的实现类有:HashMap、HashTable、TreeMap算法

内容

一般会将中间操做称为懒操做,正是由于懒操做结合终结操做,数据源构成的处理管道(Pipeline),实现了Stream的高效数据库

JVM在判断两个class是否相同时,不只要判断两个类名是否相同,还要判断是不是同一个类加载器加载的。数组

避免重复加载,父类已经加载了,则子CLassLoader没有必要再次加载。 考虑安全因素,假设自定义一个String类,除非改变JDK中CLassLoader的搜索类的默认算法,不然用户自定义的CLassLoader如法加载一个本身写的String类,由于String类在启动时就被引导类加载器Bootstrap CLassLoader加载了。安全

数组和集合都是Java中的容器 数组的长度是固定的,集合的长度是可变的 数组只能存储相同数据类型的数据,这里的数据类型能够是基本数据类型,也能够是引用类型 集合能够存储不一样数据类型的对象的引用(但通常状况下,咱们会使用泛型来约定只使用1种数据类型),但不能存储基本数据类型。线程

若是理解了,你们考虑这么一个问题:ReentrantLock(或者其它基于AQS实现的锁)是如何保证代码段中变量(变量主要是指共享变量,存在竞争问题的变量)的可见性?对象

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量主要是指共享变量,存在竞争问题的变量。Java内存模型规定全部的变量都存储在主内存中,而每条线程还有本身的工做内存,线程的工做内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的全部操做(读取、赋值等)都必须在工做内存中进行,而不能直接读写主内存中的变量(根据Java虚拟机规范的规定,volatile变量依然有共享内存的拷贝,可是因为它特殊的操做顺序性规定——从工做内存中读写数据前,必须先将主内存中的数据同步到工做内存中,全部看起来如同直接在主内存中读写访问通常,所以这里的描述对于volatile也不例外)。不一样线程之间也没法直接访问对方工做内存中的变量,线程间变量值得传递均须要经过主内存来完成。blog

小结

若是咱们仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式。继承

首先,声明共享变量为volatile。接口

而后,使用CAS的原子条件更新来实现线程之间的同步。

同时,配合以volatile的读/写和CAS所具备的volatile读和写的内存语义来实现线程之间的通讯。

相关文章
相关标签/搜索