java面试题合集(3)

86 阅读5分钟

学习java.java实战项目

1.1 error和exception的区别

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。

1.2 举例最常用的五个运行时异常

NullPointerException空指针、ArrayIndexOutOfBoundsException数组越界、ClassCastException 类转换异常、IllegelArgumentException输入输出异常、SecurityException 权限不够。

1.3 Sleep和wait的区别

(网上的答案:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。)

sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。对于wait的讲解一定要配合例子代码来说明,才显得自己真明白。

1.4 多线程有几种实现方式

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

同步的实现方面有五种,分别是synchronized、wait与notify、sleep、suspend、join

synchronized: 一直持有锁,直至执行结束

wait():使一个线程处于等待状态,并且释放所持有的对象的lock,需捕获异常。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

1.5 启动一个线程用run还是start

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

1.6 List和Map的区别

一个是存储单列数据的集合,另一个是存储键和值的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是

没有顺序的,其键是不能重复的,它的值是可以有重复的。

1、 List有重复值,Map没有重复key,但可以有重复值

2、 List有序,Map不一定有序

3、 List只能存单列值,Map可以存双列值

1.7 说出ArrayList,Vector, LinkedList的存储性能和特性

  1. ArrayList和Vector使用数组存储元素;LinkedList使用链表存储元素

  2. ArrayList和Vector插入删除数据时,需要搬运数据,效率较差;LinkedList使用链表,不需要搬运数据,效率高

  3. ArrayList和Vectory查询时,按数组下标查询,不需要遍历,效率高;LinkedList需要遍历,查询效率底

1.8 Java序列化

序列化是把内存Java对象保存到存储介质中,反序列化就是把存储介质中的数据转化为Java对象。Java通过ObjectInputStream和ObjectOutputStream实现序列化和反序列化。需要进行序列化的对象的类必须实现Serializable接口,通常情况下需要满足以下条件:

  1. 强烈建议手动生成serialVersionUID常量

  2. 如果需要加解密的话,需要实现两个方法readObject和writeObject方法

  3. 如果使用Hibernate二级缓存或其它缓存服务器的话,对象必须是可序列化的

  4. 如果需要远程调用对象或传值的话,则对像需要序列化

  5. 序列化类的可序列化成员必须也是可序列化的,不需要序列化的属性用transient修饰

1.9 堆和栈的区别

Java的内存分为两类,一类是栈内存,一类是堆内存。

栈中存储的是当前线程的方法调用、基本数据类型和对象的引用,栈是有序的。

堆中存储的是对象的值,堆是无序的。

方法中的局部变量使用final修饰后,放在堆中,而不是栈中。