1面试题集锦-革努信息科技JAVA1.什么时候用Assert?J2SE1.4在语言上提供了一个新特性,就是assertion(断言)功能,它是该版本在Java语言方面最大的革新。assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身、有的是通过库函数等。另外,从理论上来说,通过assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的实践意义。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。1.1)语法表示在语法上,为了支持assertion,Java增加了一个关键字assert。它包括两种表达式,分别如下:1.assertexpression1;2.assertexpression1:expression2;在两种表达式中,expression1表示一个boolean表达式,expression2表示一个基本类型或者是一个对象(Object),基本类型包括boolean,char,double,float,int和long。由于所有类都为Object的子类,因此这个参数可以用于所有对象。1.2)语义含义在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。如果assertion语句包括expression2参数,程序将计算出expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对象;如果expression1值为true,expression2将不被计算。一种特殊情况是,如果在计算表达式时,表达式本身抛出Exception,那么assert将停止运行,而抛出这个Exception。1.3)一些assertion例子下面是一些Assert的例子。1.assert0value;2.assert0value:value=+value;3.assertref!=null:refdoesn'tequalnull;4.assertisBalanced();1.4)编译由于assert是一个新关键字,使用老版本的JDK是无法编译带有assert的源程序。因此,必须使用JDK1.4(或者1.5)的Java编译器,在使用Javac命令时,必须加上-source1.4作为参数。-source1.4表示使用JDK1.4版本的方式来编译源代码,否则编译就不能通过,因为缺省的Javac编译器使用JDK1.3的语法规则。一个简单的例子如下:javac-source1.4test.java1.5)运行由于带有assert语句的程序运行时,使用了新的ClassLoader和Class类,因此,这种程序必须在JDK1.4(或者1.5)的JRE下运行,而不能在老版本的JRE下运行。我们可以选择开启assertion功能,或者不开启,另外我们还可以开启一部分类或包的assertion功能,所以运行选项变得有些复杂。通过这些选项,我们可以过滤所有我们不关心的类,只选择我们关心的类或包来观察。22.Java中如何实现数据库访问?为什么使用这种方式?使用JDBC,JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序有了JDBC,向各种关系数据库发送SQL语句就是一件很容易的事。换言之,有了JDBCAPI,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,为访问Informix数据库又写另一个程序,等等。您只需用JDBCAPI写一个程序就够了它可向相应数据库发送SQL语句。而且,使用Java编程语言编写的应用程序,就无须去忧虑要为不同的平台编写不同的应用程序。将Java和JDBC结合起来将使程序员只须写一遍程序就可让它在任何平台上运行。3.面向对象的特征是什么?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。4.多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。4.数据连接池的工作机制是什么?J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。35.写一个方法,实现字符串的反转?6.JAVA通信编程?文档见此网络资料:是最基本的数据类型吗?不是,Java只有8种基本类型:bytecharshortintlongfloatdoubleboolean8.int和Integer有什么区别?Java提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。原始类型封装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDoublepublicclassOverturn{publicstaticvoidmain(Stringargs[]){StringstrBefore=abcdefg1234567;System.out.println(倒序前:+strBefore);char[]temp=strBefore.toCharArray();intlength=temp.length;ints=length/2;chartm;if(length%2==0){for(inti=0;is;i++){tm=temp[i];temp[i]=temp[length-i-1];temp[length-i-1]=tm;}}else{for(inti=0;i=s;i++){tm=temp[i];temp[i]=temp[length-i-1];temp[length-i-1]=tm;}}System.out.println(倒序后:+newString(temp));}}4引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。9.String和StringBuffer的区别String专门定义不变字符串,而StingBuffer用来定义可变字符串。两者在性能上也有很大的区别:String比较适合短的字符串,StingBuffer适合动态增加的字符串。在实际使用过程中,要求:String+String这种在BS开发结构中不被提倡,对性能影响比较大。而StingBuffer则是比较推荐使用方法。10.运行时异常与一般异常有何异同?异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。11.Collection和Collections的区别。Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。12.&和&&的区别。&既是位运算符也是逻辑运算符,&&只是逻辑运算符,&与&&同时作为逻辑运算符时&&是短路的,而&并不短路13.HashMap和Hashtable的区别。HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。3.HashTable有一个contains(Objectvalue),功能和containsValue(Objectvalue)功能一样。4.HashTable使用Enumeration,HashMap使用Iterator。以上只是表面的不同,它们的实现也有很大的不同。5.HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:inthash=key.hashCode();intindex=(hash&0x7FFFFFFF)%tab.length;而HashMap重新计算hash值,而且用与代替求模:inthash=hash(k);inti=indexFor(hash,table.length);staticinthash(Objectx){inth=x.hashCode();h+=~(h9);h^=(h14);h+=(h4);h^=(h10);returnh;}staticintindexFor(inth,intlength){5returnh&(length-1);}以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMap对null的操作。14.final,finally,finalize的区别。final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作