常见面试题
进程和线程的区别
进程是程序的一次执行,线程可以理解为进程中执行的一段程序片段。
进程是操作系统分配资源的单位,线程是操作系统执行的单位;
或者说:进程是资源分配和拥有的单位,线程是处理器调度的基本单位。
一个线程只属于一个进程,一个进程可以有多个线程。
进程间是独立的,拥有独立的系统资源;
线程运行在进程空间内,不拥有系统资源,但同一进程的不同线程可以共享该进程的资源。
在创建或撤销进程的时候,由于系统要为之分配或回收资源,导致系统开销明显大于创建或撤销线程的开销
进程有独立的运行空间,当进程崩溃后,不会对其他进程产生隐形;
而线程只是一个进程中不同的执行路径,线程有自己的堆栈和变量,但没有单独的地址空间,一个线程死掉等于整个程序死掉。
抽象类和接口的区别
- 抽象类中可以有构造方法,接口中不能有构造方法
- 抽象类中可以有普通的成员变量,可以在子类中重新定义,也可以重新赋值;接口中不能有普通的成员变量,默认为public static final,且必须赋初值,所以实现类中不能重新定义,也不能改变其值)
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法都必须是抽象的(默认都是public abstract),不能有非抽象的
- 抽象类中可以包含静态方法,接口中不能包含静态方法
- 抽象类和接口都可以包含成员变量,但接口中定义的成员变量只能是public static final型的
- 一个类可以实现多个接口,但只能继承一个抽象类
- 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用
HashMap和Hashtable的区别
- HashMap继承自AbstractMap,而Hashtable继承自Dictionary
- Hashtable的方法是同步的,而HashMap不是,所以在多线程场合要手动同步HashMap
- Hashtable的key和value均不能为空,HashMap可以为空
- Hashtable有一个方法contains(Object value),功能和containsValue(Object value)一样,HashMap去掉了这一方法
- HashTable使用Enumeration,HashMap使用Iterator
- HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数
- 哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap重新计算hash值
面向对象基本原则
- 单一职责原则(Single Responsibility Principle SRP)
- 开放封闭原则(Open-Closed Principle OCP)
- 依赖倒置原则(Dependence Inversion Principle DIP )
- 里氏替换原则(Liskov Substitution Principle LSP)
- 迪米特法则(Law of Demeter)
- 接口隔离原则(ISP)
- 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
(参考这里)
垃圾回收机制
在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。
垃圾内存并不需要程序显示的释放,而是由JVM的系统级线程自动释放该内存块。
功能:检测无用对象,回收无用对象占用的内存还给java程序
优点:提高效率。自动释放垃圾内存,减轻编程负担;提高安全性。有效防止内存泄露,有效的使用内存
缺点:它的开销影响程序的性能。执行GC线程时需要中止执行Java程序的线程
算法:
1.引用计数法(已过时)
使用引用计数器区分存活对象和不再使用的对象。堆中的每个对象对应一个引用计数器,当每次创建一个对象并赋给一个变量时,引用计数器就加1,当一个对象的某个引用超过了生命周期或者被赋予新值时,计数器减一。引用计数器为0的可以当做垃圾回收。优点执行快,缺点无法检测循环引用。
2.跟踪收集器
建立一个根对象的图,沿着整个对象图上的每条链接,递归确定可到达性。不可到达的作为垃圾收集。
标记--清除
标记需要回收的对象,然后把这些对象内存信息清除
标记--清除--压缩
标记清除算法会形成内存碎片,所以需要把对象压缩到一边,留出另一边可用内存。
标记--清除--复制
分配两个空间,把A空间中活动对象复制到B中,然后一次性把空间A删除,