`

大唐电信JAVA笔试题面试题-解答

 
阅读更多

转载:http://my.oschina.net/chape/blog/164762

 

目录[-]

1.    描述一下public,protected,private,final,native,synchronized  ,volatile,transient 关键字在Java中的用法?

1
2
3
4
5
类内部       package内        子类          其他
public            允许         允许             允许         允许
protected         允许         允许             允许         不允许
default           允许         允许             不允许       不允许
private           允许         不允许           不允许       不允许

被定义为final的类不允许出现子类,不能被覆盖,字段值不允许被修改

native与操作平台相关,定义时并不实现其方法,方法的实现被一个外部的库实现

synchronized对于一个静态的方法,在执行之前jvm把它所在的类锁定;对于一个非静态类的方法,执行前把某个特定对象实例锁定。

volatile异步线程可以访问字段时,于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互,volatile屏蔽掉了VM中必要的代码优化。所以在效率上比较低,因此一定在必要时才使用此关键字。 

transient,字段不是对象持久状态(序列化)的一部分,不应该把字段和对象一起串起

2.    Abstract class 和Interface 有什么区别?

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型,不过在 interface中一般不定义数据成员

7. 一个类可以实现多个接口,但只能继承一个抽象类

3.    Vector 和 ArrayList 有什么区别?HashTable 和 HashMap有什么区别?

Vector和ArrayList一样是数组实现的,二者的差别在于:Vector是线程安全的,所以性能上不如ArrayList

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:

1
2
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新计算hash值,而且用与代替求模: 

4.    Java集合中的Iterator起什么作用?

     iterator迭代器,对集合进行遍历,有两个比较常用的方法:.hasNext();和.next();前者返回boolean后者返回结果。使用 Iterator 的好处在于可以使用相同方式去遍历集合(List 是有序集合)中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口)。如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 TreeSet 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。

5.    Java中创建一个对象有哪几种方法,区别是什么?

1.用new语句创建对象,这是最常用的创建对象的方式。
2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
3.调用对象的clone()方法。
4.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法(对象的序列化与反序列化)。

6.    多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?

线程实现方法:
(1)继承Thread类,重写run函数,
 开启线程:对象.start() //启动线程,run函数运行

(2)实现Runnable接口,重写run函数

(3)实现Callable接口,重写call函数

        Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。   Callable和Runnable有几点不同:

        1.Callable规定的方法是call(),而Runnable规定的方法是run(). 
        2.Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
        3.call()方法可抛出异常,而run()方法是不能抛出异常的。 

        4.运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果

同步方法:

1  wait方法:
        该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
        调用wait方法需要注意几点:
        第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
        第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。
        第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
        第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。

2  notify方法和notifyAll方法:
        notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
        notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。

3 synchronized关键字:
        第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁,this
        第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁,class
        第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。

7.    描述一下Java中的异常机制,什么是Checked Exception, Unchecked Exception?

     

      当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

1、任何的异常都是Throwable类,并且在它之下包含两个字类Error和Exception。RuntimeException是Exception的子类。
2、 除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception,至于Error与RuntimeException则被统称为Unchecked Exception
3、Error:Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。
4、Checked exception:这类异常都是Exception的子类 。异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。(SQLException)
5、Unchecked exception:  这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它 们不能通过client code来试图解决,所以称为Unchecked exception。(NullPointerException)
6、当程序执行过程中,遇到uncheck exception,则程序中止,不再执行之后的代码。

8.    描述一下Java ClassLoader 或者 J2EE ClassLoader的工作原理?

ClassLoader的工作原理 

      每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类系统默认的contextClassLoader是 systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类 和$CLASSPATH/中的类可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为 

ClassLoader被组织成树形,一般的工作原理是: 
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类 
2) contextClassLoader请求它的父ClassLoader来完成该载入请求 
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入 

Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。 
    这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader 
和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader 

9.    MVC的各个部分都有那些技术来实现?如何实现?

10.    描述一下Struts的工作方式?

11.    JSP中包含哪几个内置对象?

12.    JSP中两种跳转方式分别是什么?有什么区别?

13.    描述一下JSP中taglib的用法?

14.    Javascript中如何校验数字型?

15.    EJB2.0中包括哪些内容? 作用分别是什么?

16.    一个SessionBean包含哪几个组件?各个组件作用是什么?

17.    描述一下一个EJB应用中EJB部署文件,以及你所熟悉的App Server的部署文件的作用?

18.    列举一下你所知道的设计模式(包括EJB,J2EE的设计模式),以及他们应用的场合?

19.    解析XML主要方法有哪些? 各有什么区别?

20.    您了解Open Source的项目吗? 如果了解请描述几个,并讲述一下他们的作用?

21.    您看过哪些JAVA方面的书籍,能列举一下吗?

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics