1.HashTable与HashMap区别

  • 1.HashTable线程安全,HashMap线程不安全,HashMap要线程安全可以使用HashMap map = Collection.synchronized(new HashMap<Integer>()).
  • 2.HashTable不能有null的key,HashMap可以有.

2.TreeSet与TreeMap的底层实现

它们都是用红黑树实现的, 它们的Key都是有序的. 红黑树是一种二叉搜索树, 但是是平衡的. 它有如下性质:

  • 根节点是黑色的.
  • 红色节点的左右节点都是黑色的.
  • 叶节点都是null, 且叶节点都是黑色的.
  • 节点非黑即红.
  • 任意节点到其子叶节点路径中黑色节点的数量都是相同的.

因此,如果黑色高度为N,则根节点到叶节点的距离最小为N,最大为2 * (N - 1). 且最大路径情况为黑红交替,最小路径情况为纯黑..

3.Java重载Overload和重写Override区别

重载是同一个类中,同一函数名但参数不同,调用时根据参数来区分调用具体哪个方法,也就是静态多态性

重写是子类继承基类,函数名相同,参数也相同,但是把这个方法重写,也就是动态多态性.

4.Java动态绑定

在运行时,java虚拟机会根据实际创建的对象类型决定使用那个方法(重写).

5.static什么意思,能否重写static方法

static是静态的意思,一个类即使未实例化,它的static变量和方法也会被初始化.不能重写static方法,static是静态绑定的,而重写是动态绑定的.

6.Java自动拆装箱什么意思

Integer到int,Double到double的转化就是自动拆箱,反之是自动装箱.

7.Java中抽象类和接口的区别

  • 抽象类只能继承一个,但是接口可以implements多个.
  • 接口中的全部方法都是要具体实现的,但是抽象类中的方法可以根据定义abstract与否来决定是否完成这个方法的实现.
  • 接口中的变量都是默认final的,不可改变,但是抽象类中可以自行定义.

8.Java中进程和线程的区别是什么

9.Java中volatile关键字有什么作用

volatile有两个语义.

  • 第一个是volatile修饰的变量对所有线程都有可见性,也就是变量被更改后会立刻更新主内存,同时工作内存调用该变量时也会立刻从主内存更新到工作内存.
  • 第二个是禁止指令重排序优化.

但是它依然无法完全保证同步,因为当两个线程同时在机器码中执行到了某个改变volatile修饰的变量时,它依然会出问题.

10.Java内存模型(JMM)中原子性操作有哪些

read,load,assign,use,store,write

11.Java中volatile和synchronized的区别

  • volatile是保证可见性,也就是说有更新主内存和工作内存的过程.而synchronized是保证当前只有一个线程对该部分进行访问.
  • volatile仅有可见性,而synchronized有可见性和原子性.
  • volatile不会造成线程阻塞,而synchronized有可能会.
  • volatile是作用于变量的,而synchronized还可以作用于方法.

12.Java中lock和synchronized区别

synchronized是JVM层面的,lock是程序层面的,需要开发者定义lock与unlock.

13.Java内存回收算法

  • 标记-清除法,标记要回收的对象,然后清除它们,但效率太低,还有内存碎片.
  • 复制法,将内存分为两块,每次只用一块,回收时将仍然存留的按顺序复制到另一块内存.浪费内存.
  • 标记-整理法,同样是标记要回收的对象,但是清除后对其进行整理,按顺序将留下的部分向前整理.
  • 分代收集算法,就是按照新生代和老年代来采用不同的回收算法,新生代用复制法,老年代用标记清除法或标记整理法.

14.Java内存区域组成

堆,虚拟机栈,方法区,程序计数器

堆是线程共享的,用来存放对象实例.

虚拟机栈是线程独占的,用于存储局部变量表,动态链接,方法出口等信息.

方法区是线程共享的,用来存储编译时的静态变量,类信息,常量和编译后的代码等.

程序计数器存储的是下一条指令的地址.

15.对方法区中类进行垃圾回收的条件是什么

  • 该类在堆中没有任何实例
  • 加载该类的classLoader已经被回收
  • 该类对应的Java.lang.class没有在任何地方被引用

16.虚拟机类加载过程

加载,连接(验证,准备,解析),初始化,其中解析可以在初始化后执行(动态链接).

加载:首先通过类的全限定名获取类的二进制字节流.然后将二进制字节流放到方法区形成相应数据结构.最后在堆中生成一个java.lang.class对象,最为方法区访问入口.

验证:四个验证过程,文件验证,元数据验证,字节码验证,符号引用验证.

准备:为类的静态变量分配内存,赋零值.

初始化:获取静态成员,设置静态成员,调用静态成员或者new一个类时会立即初始化这个类.

17.类加载器与类相同有无关系

有关系,只有相同的类加载器加载的class文件才是相同的,不然不同的加载器即使class文件相同加载后的类也是不同的.

18.类加载器种类

双亲委派模型:启动类加载器<-扩展类加载器<-应用程序加载器<-自定义加载器,当收到加载一个类的请求时,都会先委派给父加载器,当父加载器不能加载时才会考虑自己加载.

19.Java线程start和run的区别

start是启动一个线程,而直接调用run只是一个普通方法调用,并没有启动线程。

TO BE CONTINUED!