JAVA基础面试题(二)
1.Java中的异常处理机制的简单原理和应用?
异常是指Java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间,地点,人物,情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每一个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。Java.lang.throwable,throwable下面又派生出两个子类:error和exception。
error表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,内存溢出和线程死锁等系统问题。
exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件是软件本身缺陷所致的问题,也就是软件开发人员考虑不周所致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(arrayindexoutofboundsexception),空指针异常(nullpointrexception),类型转换异常(classcastexception);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
Java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try.......catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常也可以处理,也可以不处理,所以编译器不强制用try....catch处理或用throws声明,所以系统异常也称为unchecked异常。
注:出现系统异常后,系统会把异常一直往上层抛,一直遇到处理代码,如果没有遇到处理到最上层,如果是多线程就由thread.run()抛出,如果是单线程就被main()抛出。若是线程,线程结束,若是主程序,程序退出。
2.最常见的运行异常?
arrayindexoutofboundsexception 数组脚本越界 nullpointrexception 空指针异常
classcastexception 类型转换异常 arithmeticexception 算术条件异常
classnotfoundexception 指定的类不存在
3.Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块可以抛出异常吗?
throws是获取并向外抛出异常
throw是抛出异常
try是将会发生异常的语句括起来,从而进行异常的处理,
catch是如果有异常就会执行他里面的语句,
try...catch是内部捕获异常并做自定义处理
而finally不论是否有异常都会进行执行的语句。
* 如果要捕捉throw抛出的异常,则必须使用try—catch语句。可见,throw可以主动抛出异常,也就是可以在try中抛出异常
throw和throws的详细区别如下:
throw是语句抛出一个异常。
语法:throw (异常对象);
throw e;
throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
public void doA(int a) throws Exception1,Exception3{......}
1. 区别
throws是用来声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型。此外throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。
2.分别介绍
throws:用于声明异常,例如,如果一个方法里面不想有任何的异常处理,则在没有任何代码进行异常处理的时候,必须对这个方法进行声明有可能产生的所有异常(其实就是,不想自己处理,那就交给别人吧,告诉别人我会出现什么异常,报自己的错,让别人处理去吧)。
格式是:方法名(参数)throws 异常类1,异常类2,.....
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
throw是具体向外抛异常的动作,所以它是抛出一个异常实例。
throws说明你有那个可能,倾向。
throw的话,那就是你把那个倾向变成真实的了。
同时:
a、throws出现在方法函数头;而throw出现在函数体。
b、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
c、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
4.sleep()和wait()有什么区别?
sleep就是正在执行的线程主动让出cup,cpu去执行其他线程,在sleep指定的时间后,cup才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cup,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手中,别人还没有释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notify方法后增加一个等待和一些代码,看效果)调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。
5.多线程有几种实现方法?同步有几种实现方法?
多线程有两种实现方法,分别是继承thread类和实现runnable 接口
同步的实现方式有两种synchronized,wait,与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException(中断异常)异常。
notify();唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由jvm确定唤醒那个线程,而不是按优先级。
Allnotity():唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让他们竞争。
6.启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码
7.介绍collection框架的结构?
集合框架(Collection Framework)泛指java.util包的若干个类和接口.如Collection,List,ArrayList,LinkedList,Vector(自动增长数组),HashSet,HashMap等.
集合框架中的类主要封装的是典型的数据结构,如动态数组,链表,堆栈,集合,哈希表等.
集合框架类似编程中经常用到的工具类,使得编码这专注于业务层的实现,不需要从底层实现相关细节—“数据结构的封装”和”典型算法的实现”.
Java.util.collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。collection接口在Java类库中有很多具体的实现。collection 接口的意义是为各种具体的集合提供了最大化的统一操作方式。
8.collection和collections的区别?
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,它包含有各种有关集合操作的静态多态方法,此类不能实例,就像一个工具类,服务于Java的collection框架
9.collection框架中要实现什么接口?
Comparable/comparator
10.arraylist和vector的区别
list (实现)*有序可重复
vector:线程安全但速度慢,在jdk1.2后已经被arraylist取代,底层是数组结构,元素个数超过容量,增长1倍
arraylist:线程不安全查询速度快,底层是数组结构。元素个数超过容量,增长0.5倍
linkedlist:线程不安全,增删数度快,底层是链表式结构
collection(继承)
set (实现)*无序不重复
hashset:线程安全,存取速度快
treeset:线程不安全,元素以二叉树的形式排列
11.hashmap和hashtable的区别?
同:它们都实现了map接口
异:a.hashmap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下效率要高于hashtable;
b.hashmap允许将null作为一个entry的key或者value,而hashtable不允许
c.最大的不同是,hashtable的方法是synchrionize的,而hashMap不是,在多个线程访问hashtable时,不需要自己为它的方法实现同步,而
hashmap就必须为之提供外同步。
总结:
历史原因:hashtable是基于陈旧的dictionary 类的,hashmap是Java1.2引进的map接口的一个实现。
同步性:hashtable是线程安全的,也就是说是同步的,而hashmap是线程不安全的,不是同步的三值;只有hashmap可以让你将空值作为一个表的key或alue
Map(实现)
hashtable:线程安全,链表结构,查找慢,增删快。且key与value不能为null,
hashmap:线程不安全,数组结构,查找块,增删慢。允许将null作为一个entry的key或者value