JAVA面试宝典(2)

23、什么时候用assert。
assertion (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持
这种机制。在实现中,assertion就是在程序中的一条语句,它对一个 boolean表达
式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false
,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion
用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为
了提高性能,在软件发布后,assertion检查通常是关闭的。




24、GC是什么? 为什么要有GC?
  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题
的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的
GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没
有提供释放已分配内存的显示操作方法。




25、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译)




26、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回与参数最接近的长整数,参数加1/2后求其floor.




27、String s = new String("xyz");创建了几个String Object?
两个




28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出
程序。
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
}
}




29、Java有没有goto?
java中的保留字,现在没有在java中使用。




30、启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这
意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产
生必须退出的标志来停止一个线程。




31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的

SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发
出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户
机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个Stateful
Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户
机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此
客户机相关联的Bean实例。
EntityBean:Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库
中的数据存在,Entity beans就一直存活。而不是按照应用程序或者服务进程来说的
。即使EJB容器崩溃了,Entity beans也是存活的。 Entity Beans生命周期能够被容
器或者 Beans自己管理。
EJB通过以下技术管理实务:对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems
的Transaction Service(JTS)、Java Transaction API(JTA),开发组(X/Open
)的XA接口。




32、应用服务器有那些?
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application
Server,jBoss,Tomcat




33、给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException
, CannotRedoException, CannotUndoException, ClassCastException, CMMException
, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException
, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException
, ImagingOpException, IndexOutOfBoundsException, MissingResourceException
, NegativeArraySizeException, NoSuchElementException, NullPointerException
, ProfileDataException, ProviderException, RasterFormatException, SecurityException
, SystemException, UndeclaredThrowableException, UnmodifiableSetException
, UnsupportedOperationException
34、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承
实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,
但前提是实体类必须有明确的构造函数。




35、List, Set, Map是否继承自Collection接口?
List,Set是,Map不是




36、说出数据连接池的工作机制是什么?
J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如
果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参
数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就
可以使用这个连接。




37、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized
?
都不能




38、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。




39、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals
()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判
读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是
当两个分离的对象的内容和类型相配的话,返回真值。




40、构造器Constructor是否可被override?

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading


41、是否可以继承String类?
String类是final类故不可以继承。




42、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的
参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。






43、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不
会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。




44、编程题: 用最有效率的方法算出2乘以8等於几?
2 << 3




45、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对
不对?
不对,有相同的hash code。




46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可
返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到
方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,
但对象的引用是永远不会改变的。




47、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对
象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。




48、编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。


一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的
该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引
用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
   file://在自己内部定义自己一个实例,是不是很奇怪?
   file://注意这是private 只供内部调用
   private static Singleton instance = new Singleton();
   file://这里提供了一个供外部访问本class的静态方法,可以直接访问  


   public static Singleton getInstance() {
     return instance;   
   }
}
第二种形式:
public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  file://这个方法比上面有所改进,不用每次都进行生成对象,只是第一次  
   
  file://使用时生成实例,提高了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些




49、Java的接口和C++的虚类的相同和不同处。
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方
法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,
因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有
的方法和属性,并且接口里面的属性在默认状态下面都是 public static,所有方法
默认情况下是public.一个类可以实现多个接口。




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




51、垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管
理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由
于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"
作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回
收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死
亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器
对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收
,增量垃圾回收。




52、请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉
InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确
切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级

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










53、你所知道的集合类都有哪些?主要方法?
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它
们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List
适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和
"值"),其中每个键映射到一个值。




54、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要
的Java运行时系统组件。它负责在运行时查找和装入类文件的类。








55、char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以
放一个中文是没问题的




56、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify






58、线程的基本概念、线程的基本状态以及状态之间的关系
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一
个线程,也就是程序本身。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。




59、JSP的常用指令
<%@page language="java" contenType="text/html;charset=gb2312" session="true
" buffer="64kb" autoFlush="true" isThreadSafe="true" info="text" errorPage
="error.jsp" isErrorPage="true" isELIgnored="true" pageEncoding="gb2312"
import="java.sql.*"%>
isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)
<%@include file="filename"%>
<%@taglib prefix="c"uri="http://......"%>




60、什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()

你可能感兴趣的:(Java面试)