每日面试题
1.线程和进程的区别?
进程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程,或者更专业化来说:进程是指程序执行时的一个实例。线程是进程的一个实体进程——资源分配的最小单位,
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。进程——资源分配的最小单位,线程——程序执行的最小单位。
2.创建多线程的方式?
在JDK1.5之前,创建线程就只有两种方式,即继承java.lang.Thread类和实现java.lang.Runnable接口;而在JDK1.5以后,增加了两个创建线程的方式,即实现java.util.concurrent.Callable接口和线程池。下面是这4种方式创建线程的代码实现。
(1)通过继承 Thread 类
(2)通过实现 Runnable 接口(推荐使用,因为 Java 中是单继承,一个类只有一个父类,若继承了 Thread 类,就无法在继承其它类,显然实现 Runnable接口更为灵活)
(3)通过实现 Callable 接口(Java 5 之后)
(4)线程池
3.请说出同步线程及线程调度相关的方法?
1)wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
2)sleep(): 使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理
3)notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒
某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且与优先级无关;
4)notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而
是让它们竞争,只有获得锁的线程才能进入就绪状态;
注意:java 5 通过 Lock 接口提供了显示的锁机制,Lock 接口中定义了加锁(lock()方法)
和解锁(unLock()方法),增强了多线程编程的灵活性及对线程的协调
4. 启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
5.什么是死锁?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程 都陷入了无限的等待中
6.获得一个类的类对象有哪些方式?
1)第一种:类型.class,例如:String.class
2)第二种:对象.getClass(),例如:”hello”.getClass()
3)第三种:Class.forName(),例如:Class.forName(“java.lang.String”)
设计模式的分类
总体来说设计模式分为三大类:
- 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、
- 命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
单例模式
单例模式的好处:
1.某些类的创建比较频繁,对于一些大型的对象,这是一笔很大的开销。
2.省去了new的操作,节省了内存的开销,减轻了GC的压力。
有些情况只能用单例的设计模式,例如,一些交易核心,只能用一个对象,不然就会乱套了。
饿汉式:(线程安全的)
// 私有的构造方法
private Singleton(){
}
// 指向自己实例的私有静态引用
private static Singleton singleton = new Singleton();
// 以自己实例为返回值的静态的公有的方法
public static Singleton getInstance() {
return singleton;
}
}
懒汉式(线程不安全)
// 私有的构造方法
private Singleton() {
}
// 不建立对象
private static Singleton singleton = null;
// 以自己实例为返回值的静态的公有的方法
public static Singleton getInstance() {
if (singleton == null) {// 先判断是否为空
singleton = new Singleton();// 如果为空建立对象
}
return singleton;
}
}
工厂模式
- 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
- 主要解决:主要解决接口选择的问题。
- 何时使用:我们明确地计划不同条件下创建不同实例时。
- 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
- 关键代码:创建过程在其子类执行
适配器模式
- 意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
- 何时使用:
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些 类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)- 如何解决:继承或依赖(推荐)。
- 关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。
获得一个类的类对象有哪些方式?
1):类型.class,例如:String.class
2):对象.getClass(),例如:”hello”.getClass()
3):Class.forName(),例如:Class.forName(“java.lang.String”)
break 和continue 的区别?
- break 和 continue 都是用来控制循环,主要是终止循环;
- break 用于完全结束一个循环,跳出循环体执行循环后面的语句;
- continue 用于跳过本次循环,执行下次循环;





