1.解释内存中 stack、heap、static area的用法
stack:驻留于常规的RAM,是仅次于寄存器的最快的地方,常用于保存局部变量、句柄对象。
heap:一种常规用途的内存池(RAM区域),保存Java对象。
static area:static指的是位于固定的位置,(仍在RAM区域),使用static关键字指出一个对象中特定的元素是静态的。
2.什么是Java的优先级队列(Priority Queue)
Priority Queue 是一个基于优先堆的无界队列,优先队列不允许空值。
因为有限队列需要使用Comparable和Comparator接口对对象进行排序,所以优先队列不允许 non-comparable 的对象。
因为优先队列是一个最小堆,所以优先队列的头是是基于Comparable的最小元素。当获取优先队列时,获取队列的头对象。
Priority Queue 是非线程安全的,PriorityBlockingQueue 是线程安全的。
3.描述JVM加载class文件的原理机制
Bootstarp Classloader --> Extension Classloader --> App Classloader
当需要加载一个类时,App Classloader 先找到相应的class文件,询问 Extension Classloader 是否可以装载,
Extension Classloader 询问 Bootstarp Classloader 是否可以装载,当两者都无法装载时,App Classloader
会装载这个 class 文件,在装载时文件验证器会对 class 文件进行详细的检查
4.Java中会存在内存泄漏吗?
肯定会!
ThreadLock变量是维护在Thread内部的,只要线程不退出,对象的引用会一直存在。
当我们使用ThreadLock并且使用线程池时,因为当前的线程不一定销毁,所以可能 ThreadLock 中引用了一个很大的对象,
这个对象已经没有用处,但是因为存在对该对象的引用,所以该对象不能被GC回收,引起内存泄漏。
虽然在Java中失去引用的对象会自动的被GC,这使得我们不需要去考虑一个对象在失去引用时如何回收的情况。但相对来说,
我们更需要注意的是那些隐藏的引用,这类的引用更不容易被发现,但是一旦存在这类引用那肯定就会引起内存泄漏。
5.匿名内部类是否可以继承其他类、是否可以实现接口
可以继承其他类、可以实现其它接口
事实上,我们是由匿名类时是必须要继承一个类或者实现一个接口的。
6.什么时候使用断言
当确定程序某个地方一定为真时使用断言来验证,如果不为真,则处理器会发出一个错误信息并终止程序的运行。
对“一定不可能发生”的事情使用断言。
8.简述 synchronized 和 java.util.concurrent.locks.Lock 的异同
相同点:Lock 可以完成 synchronized 的所有功能
不同点:Lock 比 synchronized 有更好的性能, synchronized 可以自动释放锁,Lock需要手动释放,并且必须
在 finally 从句中释放。
9.并行和并发
并行(共同运行):在同一时间间隔内执行,但任意时刻点只有一个程序运行。
并发(共同发生):在同一个时刻共同运行。
stack:驻留于常规的RAM,是仅次于寄存器的最快的地方,常用于保存局部变量、句柄对象。
heap:一种常规用途的内存池(RAM区域),保存Java对象。
static area:static指的是位于固定的位置,(仍在RAM区域),使用static关键字指出一个对象中特定的元素是静态的。
2.什么是Java的优先级队列(Priority Queue)
Priority Queue 是一个基于优先堆的无界队列,优先队列不允许空值。
因为有限队列需要使用Comparable和Comparator接口对对象进行排序,所以优先队列不允许 non-comparable 的对象。
因为优先队列是一个最小堆,所以优先队列的头是是基于Comparable的最小元素。当获取优先队列时,获取队列的头对象。
Priority Queue 是非线程安全的,PriorityBlockingQueue 是线程安全的。
3.描述JVM加载class文件的原理机制
Bootstarp Classloader --> Extension Classloader --> App Classloader
当需要加载一个类时,App Classloader 先找到相应的class文件,询问 Extension Classloader 是否可以装载,
Extension Classloader 询问 Bootstarp Classloader 是否可以装载,当两者都无法装载时,App Classloader
会装载这个 class 文件,在装载时文件验证器会对 class 文件进行详细的检查
4.Java中会存在内存泄漏吗?
肯定会!
ThreadLock变量是维护在Thread内部的,只要线程不退出,对象的引用会一直存在。
当我们使用ThreadLock并且使用线程池时,因为当前的线程不一定销毁,所以可能 ThreadLock 中引用了一个很大的对象,
这个对象已经没有用处,但是因为存在对该对象的引用,所以该对象不能被GC回收,引起内存泄漏。
虽然在Java中失去引用的对象会自动的被GC,这使得我们不需要去考虑一个对象在失去引用时如何回收的情况。但相对来说,
我们更需要注意的是那些隐藏的引用,这类的引用更不容易被发现,但是一旦存在这类引用那肯定就会引起内存泄漏。
5.匿名内部类是否可以继承其他类、是否可以实现接口
可以继承其他类、可以实现其它接口
事实上,我们是由匿名类时是必须要继承一个类或者实现一个接口的。
例如:一个方法的参数是一个抽象方法,那么在给这个方法传递参数时,可以直接使用匿名抽象类
public abstract class Bird {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int fly();
}
public class Test{
public void test(Bird bird){
System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");
}
public static void main(String[] args) {
Test test = new Test();
//以下是匿名内部类
test.test(new Bird() {
private String name = ""; //匿名内部类的属性
//匿名内部类不能由构造函数,所以使用代码块初始化
{
name = "大雁";
}
//以下是方法的重写
public int fly() {
return 10000;
}
public String getName(){
return name;
}
});
}
}
6.什么时候使用断言
当确定程序某个地方一定为真时使用断言来验证,如果不为真,则处理器会发出一个错误信息并终止程序的运行。
对“一定不可能发生”的事情使用断言。
8.简述 synchronized 和 java.util.concurrent.locks.Lock 的异同
相同点:Lock 可以完成 synchronized 的所有功能
不同点:Lock 比 synchronized 有更好的性能, synchronized 可以自动释放锁,Lock需要手动释放,并且必须
在 finally 从句中释放。
9.并行和并发
并行(共同运行):在同一时间间隔内执行,但任意时刻点只有一个程序运行。
并发(共同发生):在同一个时刻共同运行。