1. 线程和进程的区别?
1. 概念上:
进程: 一个程序对一个数据集的动态执行过程,是分配资源的基本单位
线程: 一个进程的基本调度单位
线程划分尺度小于进程,一个进程包含一个或多个线程
2.从执行过程中来看
进程: 拥有独立单元的内存单元,而多个线程共享内存,从而提高应用程序的效率
线程: 每一个独立的线程,都有一个程序运行入口,顺序执行序列,和程序入口.但是线程不能独立的执行,必须依存应用程序中,由应用程序提供多个线程执行控制
3.逻辑角度来看(重要区别)
多线程的意义在于一个应用程序中,有多个执行部分同时执行.但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源配置
这种抽象的概念,千万别记,要么结合项目业务回答,要么结合生活类比举一个有创造性的案例逗一下面试官开心
这就好比富士康流水车间,有组装手机屏幕的车间,有组装摄像头的车间,还有组装手机外壳的车间,那么每个车间就可以看做一个数据集合,整个车间的运作过程就是整个富士康分配资源的基本单位,即我们说的进程,每一个富士康每一条流水线,即为线程,线程是进程的基本调度单位,一个车间可能包含一条或多条流水线,也就是说,一个进程包含一个或多个线程,流水车间分工明确,每一个流水车间所具备的职能都是不一样的,并且一个生产线或多个生产线共享一个车间,这样工作效率特别高,类比进程拥有独立单元的内存单元,而多个线程共享内存,从而提高应用程序的效率,每一个流水线都会有一个生产节点(开始节点),并且这个流水线不能脱离所具备职能的流水车间,必须依附在这个流水车间上,因为整个车间提供了这条流水线的基础设备,和信息控制枢纽,类比:每一个独立的线程,都有一个程序运行入口,顺序执行序列,和程序入口.但是线程不能独立的执行,必须依存应用程序中,由应用程序提供多个线程执行控制,每一条条流水线所产生价值,同步工作,不过,富士康从节省成本角度考虑,不会将流水线独立成一个车间,而是用车间的形式管理和调控流水线的工作进度,和流水工人岗位分配.类比:多线程的意义在于一个应用程序中,有多个执行部分同时执行.但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源配置
2. 谈谈final, finally, finalize的区别。
- final用于声明 属性 方法 和 类 ,分别表示属性不可变,方法不可以覆盖,类不可以被继承
- finally是异常处理语句结构的一部分,表示总是执行。
- finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等
public final class BeanScope { // final用于声明 类
private final String str = "scope"; // final用于声明 属性
/**
* finalize是Object类的一个方法,
* 在垃圾收集器执行的时候会调用被回收对象的此方法,
* 可以覆盖此方法提供垃圾收集时的其他资源回收,
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
}
public final void say() { // final用于声明 方法
try{
System.out.println("BeanScope say : " + this.getClass().getSimpleName());
}catch(Exception e){
e.printStackTrace();
}finally{ // finally是异常处理语句结构的一部分,表示总是执行
System.out.println("BeanScope say : " + this.hashCode());
}
}
}
3. 匿名内部类是否可以继承其它类,是否可以实现接口?
可以和面试官借一张白纸和笔,或者自己带上笔和纸面试,然后手写代码告诉面试官你的理解,通过这样一个互动环节,面试官得到了尊重,同时你也间接的在引导面试官,主动权转移到了你身上
- 可以继承其他类,但不能用extends。
public class A {
public void a() {
System.out.println("AAA");
}
public void z() {
System.out.println("ZZZ");
}
}
public class B {
public static A getA() {
return new A() {
public void a() {
System.out.println("BBB");
}
};
}
}
A a = B.getA();
a.a(); // BBB
a.z(); // AAA
- 可以实现某接口,但不能用implements。
Interface A{
public void method();
}
A a=new A(){ public void method(){System.out.println("MMM");} };
4.Collection 和 Collections的区别
同理,一边回答面试官的时候,用笔画一下Collection的结构图,可扩展区间非常大,你想说多久就说多久,一场面试总过才30min左右,所以尽量引导面试官把知识点停留在你熟悉的区间
Collection是集合类的顶级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
5.静态内部类和匿名内部类的区别
静态内部类是被声明为静态的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。
6.&和&&的区别
&是位运算,作用是取余,java hashmap的哈希函数就是用&运算进行哈希散列,作用是比起除法运算,计算速度更快,只需要移位。 &&是且,是逻辑运算,返回真假