a) “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况 下被访问。Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编 译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。
4.Java 中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
a) 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提 供构造函数的情况下,Java 编译器会为这个类创建一个默认的构造函数。Java 中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。Java 不支持像 C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java 不会创建默认的复制构造函数
5.接口和抽象类的区别是什么?
a) Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声 明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者 是 public。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。也可以参考 JDK8 中抽象类和接口的区别(以上内容是jdk1.7)
6.进程和线程的区别是什么?
a) 进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
a) 线程在执行过程中,可以处于下面几种状态:就绪(Runnable):线程准备运行,不一定立马就能开始执行。运行中(Running):进程正在执行线程的代码。等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。睡眠中(Sleeping):线程被强制睡眠。I/O 阻塞(Blocked on I/O):等待 I/O 操作完成。同步阻塞(Blocked on Synchronization):等待获取锁。死亡(Dead):线程完成了执行。.概括的解释下线程的几种可用状态。
9.同步方法和同步代码块的区别是什么?
a) 在 Java 语言中,每一个对象有一把锁。线程可以使用 synchronized 关键字来获取对象上的锁。synchronized 关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
10..在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
a) 监视器和锁在 Java 虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许 执行同步代码。
11.什么是死锁(deadlock)?
a) 两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程 都陷入了无限的等待中
12.什么是 Java 优先级队列(Priority Queue)?
a) PriorityQueue 是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序 的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue 不允许 null 值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue 不是线程安全的,入队和出队的时间复杂度是 O(log(n))。
13.你了解大 O 符号(big-O notation)么?你能给出不同数据结构的例子么?
a) 大 O 符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。大 O 符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我 们一般使用大 O 符号基于时间,内存和性能来选择最好的实现。大 O 符号可以对大量数据的性能给出一个很好的说明。
14.HashSet 和 TreeSet 有什么区别?
a) HashSet 是由一个 hash 表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是 O(1)。另一方面,TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(), remove(),contains()方法的时间复杂度是 O(logn)。
15..finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
a) 在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中 释放对象持有的资源。
16.Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
a) JVM 的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在 JVM 启动的时 候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些 对象回收掉之前,他们会一直占据堆内存空间。
17.JVM 的永久代中会发生垃圾回收么?
a) 垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收 (Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是 为什么正确的永久代大小对避免 Full GC 是非常重要的原因。请参考下 Java8:从永久代到元 数据区 (注:Java8 中已经移除了永久代,新加了一个叫做元数据区的 native 内存区)
18.System.gc()和 Runtime.gc()会做什么事情?
a) 这两个方法用来提示 JVM 要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于 JVM 的。