Java软件开发工程师面试题

时间:2022-05-22 14:19:38

第一部分 Java的类 
1.请解释Java语言的跨平台特性。 
解析:虽然不知道什么是跨平台也可以使用Java语言进行编程,但是对于一个Java编程员来说,理解跨平台特性能够更深入掌握Java语言,所以企业中往往要求应聘者至少理解这个特性。 
参考答案:Java的跨平台特性也被称为可移植性、平台无关性,或者一次编写处处运行。他的意思就是如果用Java语言编写一个应用,那么就可以在不同平台上运行,而不需要为不同平台单独运行开发。之所以能实现跨平台的特性。主要得益于Java虚拟机(JVM),JVM解释器在运行Java应用时根据当前平台进行解释,解释成符合当前平台规范的机器码,所以可以实现同样的应用在不同平台上都能运行。 
2.请列举JAVA语言的主要特点 
解析:了解一门语言,往往从熟悉该语言的主要特点开始入手,所以企业也常常通过应聘者对JAVA语言特点的掌握程度而判断其语言基础是否扎实。 
参考答案:JAVA语言有很多特点,主要包括①跨平台性:一个应用可以不经过修改直接运行到不同的平台上。②面向对象:JAVA语言是一门面向对面的语言,可以使用对象的属性和行为,可以使用面向对象的思想进行分析设计,并实现整个应用。③解释执行JAVA应用时,JVM中的解释器将解释类文件,生成符合当前平台的字节码。④自动回收:JAVA应用中的垃圾回收是自动进行的,JVM中的后台线程将监视内存中数据的使用,当内存中的数据不再被引用时,将被作为垃圾回收,而不需要程序员动手回收。 
3.请说明一个JAVA类中主要包含哪几个元素?并说明每种元素的作用。 
解析:无论简单还是复杂的JAVA应用,都是由若干个类组成,所以类是JAVA应用的组成单位。了解一个类中包含的主要元素能够对类有一个清晰的认识。一个类中往往会有五种元素,即属性、方法、构造方法、块以及内部类、其实块和内部类比较少见。 
参考答案:JAVA类中主要包含属性、方法、构造方法、块以及内部类。属性用来定义对象的数据;方法用来定义对象的行为;构造方法可以用来创建对象;块能够用来在类加载时执行操作或者在每次实例化前执行通用操作;内部类作为类的一个成员存在,能够访问外部类的属性和方法。 
4、请说明构造方法的作用和特征 
解析:类是对象的模板,使用类往往都需要首先对类进行实例化,即创建对象。要创建对象必须使用new关键字调用构造方法(constructor)才能完成,构造方法中往往对属性进行实例化,也可以实现其他必要的功能,如读取属性文件等。构造方法有独特的特征:名字必须与类名相同且大小写敏感,而且构造方法不能声明返回值,这两个特征缺一不可。使用Eclipse工具时,可以使用菜单Generate Constructor自动生成不同的构造方法。 
参考答案:构造方法的作用是用来创建对象,使用new关键字调用。构造方法的名字必须与类的名字相同,并且大小写敏感,同时构造方法不能声明返回值类型,可以使用任意一种访问修饰符,但是不能使用其他修饰符进行修饰,如static、final、abstract等修饰符都可以修饰构造方法。 
5、什么事方法重载(overload)? 
解析:如果一个类的某个行为,会有不同的算法和逻辑,例如,Math类的计算绝对值的方法,既可以计算int类型数值的绝对值,也可以计算double类型数值的绝对值。这种情况下,每种类型都定义一个不同的方法名,如abInt、absDouble,那么类的可读性就较差,使用时,必须熟悉处理每种类型参数所对应的方法名。然而,如果使用同一个方法名,而使用不同的形式参数来区别这些方法,那么就具有很好的可读性,如abs(int i)、abs(double d)等。可读性强的代码是企业对开发人员的基本要求,方法重载能够使得代码有很好的可读性。 
参考答案:方法重载指的是在一个类中可以声明多个相同名字的方法,而方法的形式参数有区别。调用这些同名的方法时,JVM会根据实际参数的不同绑定到不同的方法。 
6、请列举Java语言中的权限访问修饰符,并说明每种权限的含义。 
解析:正确使用权限访问修饰符,能够有效控制类以及类成员的安全性,Java语言中有四种访问修饰符,包括public、同包、protected以及private,一般情况下,应用中的类多是public权限,属性多是private权限,方法多是public权限。 
参考答案:Java语言中有四种权限访问修饰符,即public、protected、同包以及private,public表示公共权限,即任何包中都可以访问:protected表示受保护权限,即同包中可以访问,同包中的子类可以访问:同包权限是默认权限,即不显示指明权限修饰符的时候就是同包权限,表示只有同包中可以访问:private是私有权限,表示只能在本类中访问。 
7、请列举Java语言中的八种基本数据类型,并说明每种数据类型的含义及长度。 
解析:数据类型在任何一门编程语言中都是很重要的知识点,属性、方法参数、方法返回值要指定各自的数据类型。Java语言虽然是一门面向对象的语言。但是也定义了基本数据类型,基本数据类型可以直接赋值,不需要使用new关键字创建,可以直接使用运算符进行运算,编程中经常被使用,而且Java语言中的基本数据类型的长度固定,不会随着平台的不同而不同。 
参考答案:Java语言的八种基本数据类型有:byte字节型,8位长度:short短整型,16位长度,int整型,32位长度:long长整型,64位长度:float单精度浮点型。32位长度:double双精度浮点型,64位长度:char字符型,16位长度:boolean型,表示逻辑值,有true和false两个值,分别表示真和假 
8.什么叫引用类型,引用类型和基本数据类型有什么区别? 
解析:很多初级程序员都能够理解int i=20;中的int是一种类型,称为整型。而对于类似Employee e=new Employee();这样表达式中的Employee却感觉无所适从。其实,任何一个类都是一种类型,如Employee就是一种类型,可以说变量e的类型就是Employee。Java语言中将类的类型称为引用类型,即reference type。可以说,除了八种基本数据类型之外的类型都是引用类型,包括API中所有的类、自定义的所有类,也包括数组。引用类型和基本数据类型的直观区别就是引用类型的变量需要使用new调用构造方法来赋值,而基本数据类型可以直接使用“=”号赋值。但是,引用类型中的String比较特殊,既可以使用new关键字赋值,也可以直接使用“=”赋值,一般情况下都使用“=”直接赋值。 
参考答案:Java语言中除了基本数据类型之外的类型,都称为引用类型。引用类型就是类的类型,所有的对象都是引用类型,包括数组对象。引用类型必须使用new调用构造方法进行赋值,引用类型的变量拥有自己的属性和方法,可以使用圆点调用自己的属性和方法。基本数据类型直接使用=号进行赋值,且没有自己的属性和方法,往往都在声明属性或方法时使用。 
9.对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别? 
解析:String类型是实际工作中经常使用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类。所以String类型的对象可以使用new创建,例如String name=new String(“ETC”);为变量name进行赋值,值为“ETC”。然而,String类比起其他类 
有些特殊,可以使用“=”直接赋值,如String name=“ETC”,也是为变量name进行赋值,值为“ETC”。这两种赋值方式是有差别的,使用new赋值,永远都是创建一个新对象,在新的内存空间初始化了字符串的值;而使用“=”赋值,不会每次都初始化新的字符串,而是从一个“字符串实例池”中去查找有没有要赋值的字符串,如有则直接引用;如不存在,则初始化一个字符串,并放入“字符串实例池”。在实际编程中,往往使用“=”好对String类型变量进行赋值。 
参考答案:使用“=”赋值不一定每次都创建一个新的字符串,而是从“字符串实例池”中查找字符串。使用new进行赋值,则每次都创建一个新的字符串。 
10.String类是一个“不可变类”,请解释“不可变类”的含义。 
解析:String类是一个不可变类,即immutable类。所谓不可变,意思是当一个字符串被初始化后,它的值就不会被改变。例如,String s=new String(“hello”)为将初始化一个值为hello的字符串,如果调用 s.toUpperCase()看起来是把hello变为大写的HELLO,然而事实上并不会把已有的hello变为HELLO,而是在新的空间初始化一个HELLO字符串。也正因为有这种不可变性,所以才能支持“字符串实例池”的使用。 
参考答案:所谓的不可变类,就是当字符串初始化后,就不能够被改变。 
11.String类和StringBuffer类有什么区别? 
解析:String类是不可变类,字符串一旦初始化后,就不能被改变。而StringBuffer类是可变类,字符串值可以呗改变。常常在实际应用中看到累死这样的代码:String s=new(“hello”);s+=”world”,这两句代码首先创建一个字符hello,然后将world追加到hello结尾并重新赋值给变量s。然后,这个过程实际上是这样的:首先创建一个StringBuffer对象,然后用StringBuffer类的append方法追加字符串,最后对StringBuffer对象调用toString方法合成字符串返回。可见,使用+号连接字符串时,本质上是使用了可变的StringBuffer类,经变动肯定性能效率受到影响,所以建议需要追加字符串时,可以考虑直接使用StringBuffer类。参考答案:String类是不可变类,即字符串值一旦初始化后就不可能改变。StringBuffer是可变字符串类,类似String的缓冲区,可以修改字符串的值。 
12.StringBuffer和StringBuilder类有什么区别? 
解析: StringBuffer是JDK5中增加的一个新类,在以前版本中不存在这个类。StringBuilder中的方法和StringBuffer中的方法基本相同,但是StringBuffer是线程安全的,而StringBuilder不是线程安全的,因此在不考虑同步的情况下,StringBuilder有更好的性能。 
参考答案:StringBuffer是线程安全的字符串缓冲,而StringBuilder不是线程安全的。 
13.包装器类型包括哪些类,有什么作用? 
解析:初级程序员常常对float和Float或者double和Double感到混淆。在Java语言中,有八中基本数据类型,即byte、int、long、float、double、char、boolean。对应这八种基本数据类型,API中定义了八个类,能把这些基本类型转换成引用类型,分别是Byte、Short、Int、Long、Double、Character、Boolean。这八个类被统称为包装器类。JDK5之后,包装器类和基本数据类型之间可以直接转换,称为自动的装箱拆箱(boxing/unboxing)。例如integer it=3;it++;虽然写法上可以像使用基本数据类型一样使用包装器类型,但是本质上依**行了类似 it= new Integer(3)的转换,因此,不要轻易使用包装器类的自动装箱拆箱,以优化的性能。能够使用基本类型就使用基本类型。 
参考答案:包装类器包括Byte、Short、Integer、Long、Float、Double、Character、Boolean等类,主要用来对byte、short、integer、long、float、double、character、boolean这八种基本数据类型进行包装,使其称为引用类型。 
14. 请说明Java语言中的值传递规则。 
解析:值传递时编写应用时不可避免的操作。例如某方法声明形式是public void f(int x){},写方法是,必须为其传递一个int类型的实际参数,如f(10)。又如public void g(Employee)。那么使用该方法时,必须为其传递一个Employee类型的实际参数,例如g(new Employee())。所以,对于初级程序员来说,了解Java语言的值传递规则非常重要。Java语言是本类型传递的值,例如f(10),仅仅把10复制给形式参数x,是值的拷贝。而引用类的传递时引用,即虚地址,例如g(new Employee())是把实际参数的虚地址传递给形式参数e,也就是说实际参数和形式参数的虚地址相同,物理上是同一个对象。 
参考答案:基本数据类型传递的是值,引用类型传递的是引用,即虚地址。 
15.使用static修饰属性或方法后,属性和方法有什么特征? 
解析:static修饰符是一个非常常见并重要的修饰符,称为静态。静态不是指值不能改变,很多初级程序员容易容易望文生义的地方。Static常常用来修饰类的属性或者方法。当一个属性或者方法和对象没有关系,或者说是任何对象共享的时候,那么就应该用static进行修饰。列如某类中的计数器,用来计算实例的个数。那么这个计数器属性就是所有对象共享的属性,就应该用static修饰。又例如Math类中的abs(int)方法,用来返回参数的绝对值,这个方法和Math类的对象没有关系,Math类对象可以共享这个方法,那么这个方法就可以用static修饰。程序员必须深入理解static修饰符的使用。 
参考答案:static修饰属性或方法后,属性和方法不在属于某个特定的对象,而是所有共享,也可以说是static成员不依赖某个对象,在类加载时就被初始化。Static修饰的属性或方法,可以直接使用类名调用,而不用先实例化对象再调用。 
16.使用final修饰属性后,属性有什么特征? 
解析:属性可以是变量也可以是常量,如果是常量,就需要使用final修饰。如果使用final修饰了某个属性,那么该属性值一旦被赋值,就不能被修改,实际中常常有这个样的码:private static final int ERROR=0;也就是说,常常会生命静态的常量。静态常量的命名规范非常特殊,往往都是用大写字母,如果包含多个单词,每个单词之间使用下划线连接。静态常量的意思是,该类所有的对象都拥有一个不变的常量ERROR,作为0.API中很多类都定义了很多的静态常量,使用时直接使用类名调用即可。 
参考答案:fianl修饰属性后,属性就成为一个常量。常量只要被赋值,就不能被改变。 
17.请说明操作符==的作用。 
解析:实际编程中,==是非常常用的操作符。很多初级程序员会使用这样的代码if(s==”save”0{},结果会发现,即使当字符串s的值为save时,if条件依然不能被执行。是==在比较引用类型时,比较的是两个对象的虚地址,而不是内容。要比较两个对象的内容是否相同,往往需要使用equal方法,例如if(s.equals(“save”)){}。==比较基本类型时,将比值的二进制是否相等,例如(x==0.5){}。值得注意的是,与空指针null值进行比较,往往用==进行,例如if(s==null||s.equals(“”)),表示如果字符串是空指针或者空串。 
参考答案:==可以用来比较基本类型或者引用类型。比较基本类型时,==用来比较二进制的值,比较引用类型时,用来比较对象的虚地址。 
18请说明&&与&的区别和联系 
解析:实际编程中,常常需要使用“与”或者“或”的逻辑。其中&&和&存在一定区别&&可能发生各路问题,例如if(s!=null&&s.length()==6)中,如果要的值为null,那么第一表达式的值为false,返回值肯定是false,不会计算第二个表达式的值,这就是短路。然而使用&,例如if(s!=null&s.length()==6),假设s的值为,null,返回值肯定是false,但是会判断第二个表达式的值,将发生空指针异常。实际工作中,经常使用&&操作符。 
参考答案:&&会发生短路问题,当第一个表达式的值为false时,将直接返回结果为false而不会判断第二个表达式的值。而&不会发生短路问题,即使第一个表达式的值是false,会判断第二个表达式的值。 
19. break语句能在什么场景使用。 
解析:break语句表示中断,不能够随便使用,只能在循环语句中或者switch语句中使用。初级工程师往往容易将break和return混淆。Return是可以再方法体中任意位置使用,可以带值返回页可以不带值返回,执行return语句后,该方法将返回,也就是方法执行结束。而break只能在循环体中或者switch的case语句中使用,不能随意使用。 
参考答案:break语句可以再循环体中使用,也可以在switch的case语句中使用。 
20.for循环中的break语句和continue语句的使用。 
解析:很多时候,循环是为了查找某些符合条件的数据,只要找到就没有必要继续下去,称为中断循环,break语句就可以用来中断循环。而continue语句恰恰相反,是用来继续下一次循环。值得注意的是,java语言中可以再循环前面加标号,即label,然后可以使用break或continue中断或继续标号的循环。 
参考答案:break可以用来中断循环,continue可以用来继续下一次循环。 
21 请说明一个JAVA类中主要包含哪几个元素并说明每种元素的作用。 
解析:无论简单还是复杂的JAVA应用,都是由若干个类组成,所以类是JAVA应用的组成单位。了解一个类中包含的主要元素能够对类有一个清晰的认识。一个类中往往会有五种元素,即属性、方法、构造方法、块以及内部类、其实块和内部类比较少见。 参考答案:JAVA类中主要包含属性、方法、构造方法、块以及内部类。属性用来定义对象的数据方法用来定义对象的行为构造方法可以用来创建对象块能够用来在类加载时执行操作或者在每次实例化前执行通用操作内部类作为类的一个成员存在,能够访问外部类的属性和方法

第二部分 类之间的关系

1.用代码表示A类关联B类的情况。 
解析:一个Java应用中不可能只有一个类,所以了解类之间的关系对程序员来说非常重要。关联关系是最常用的一种关系,如果说A关联B,那么就是B作为A的属性存在。关联关系是一种复用的策略,即A关联B的时候,A可以复用B的行为。 
参考答案: 
Class A{ 
Private B b; 
Public void setB(B b){ 
This.b=b; 


2.请说明Java语言中数组的基本概念,数组的作用,以及数组的声明创建方式。 
解析:数组时任何一门语言里都常用的类型,Java语言也不例外。程序员了解数组,不能仅仅从语法上了解,而应该深入理解数组的作用。数组可以用来存储类型相同的元素,作为一种数据容器使用。和数组类似的概念是集合,也能作为数据容器使用。 
参考答案:数组时相同元素的集合,作为数据容器使用。声明创建一个int型数组,如下所示:int[]x=new int[3];其中3是数组的长度,该数组能够存储3个int型变量。 
3.使用代码,创建一个长度为5的String型数组,并使用增强for循环迭代数组打印出数组中的元素。 
解析:增强for循环是JDK5增加的特性,可以方便地遍历数组或集合。程序员需要了解的是,如果JDK版本低于5.0,则不支持这个功能。另外,并不是说有了增强for循环后,传统的for循环就不被使用,增强for循环只能用来方便地遍历数组和集合,其他情况下还要使用传统的for循环。 
参考答案: 
String[] sArray = new String[5]; 
For(String s:sArray){ 
System.out.println(s); 

4.说明Arrays类的作用。 
解析:在实际工作中,常常需要对数组中的元素进行处理,例如排序等。初级程序员往往选择自己编写算法实现。实际上APV中提供了Arrays类,该类中定义了很多和数组有关的工具方法,能够方便地处理数组,是程序员必须掌握的类。 
参考答案:Arrays类是java.util包中的一个类,类中所有的方法都是static方法,这些方法都是数组对象的工具方法,能够对数组进行处理,如sort方法可以对数组元素进行排序 
5.请使用简单代码展示A类依赖B类的含义。 
解析:对于程序员来说,了解类和类之间的关系非常必要。依赖关系指的是一种瞬间的关系。如果A依赖B,一般指的是A类的某个行为,需要B类对象作为参数。 
参考答案: 
Class A{ 
Public void f(B b) 

6.请说明依赖关系和关联关系的区别。 
解析:关联关系和依赖关系是非常常见的两种关系,二者的区别也很明显,程序员了解二者的区别能够更深入的理解面向对象的思想。 
参考答案:依赖关系是一种瞬时关系,A依赖B,指的是A的某个行为的参数是B的类型,也就是说,A要想实现这个行为,必须依赖B的实例,A关联B,是一种长久的关系。关联关系的是B作为A的属性存在,只要实例化一个A的对象,就会为这个A的对象实例化一个B的对象,作为它的属性使用,可以在A中任何需要使用B的地方使用B。 
7.继承有什么作用,Java语言中的继承有什么特点? 
解析:继承是面向对象语言的一大特征,主要作用是重复使用,子类通过继承父类,能够重复使用父类的属性和方法。指的注意的是,有两个策略都可使实现重复使用,一个是关联,一个是继承,实际编程中,关联用的更多。因为子类继承父类后,相当于父类中的细节将暴露给子类。初级程序员一定不要随意使用继承,避免滥用继承。 
参考答案:继承主要为了能够重复使用父类中的成员。Java语言中的继承是单继承,也就是说一个类最多只能继承一个父类。 
8、什么是方法覆盖(override)?并说明方法覆盖与方法重载(overioad)的区别。 
解析:方法覆盖是一个非常重要的概念,是多态性的一个体现。方法覆盖发生再去爱继承关系中,当子类需要修改从父类继承到某个方法的方法体时,就可以声明一个父类同名同参数同返回值的方法,这样就对父类中的那个方法进行了覆盖,子类对象调用该方法时将自动绑定到子类中的方法。API中很多类中都进行了方法覆盖,如String类中的toString方法,就覆盖了父类Object中的toString方法。 
参考答案:覆盖是发生在继承关系的子类中,当子类要修改从父类继承的某个方法的方法体时,就可以在子类中声明一个与父类同名、同参数并且同返回值类型的方法,这就是方法覆盖。而重载与继承没有关系,指的是在一个类中可以同时声明多个同名但不同参数的方法,称为重载。 
9、请说明什么是抽象类?抽象类有什么作用? 
解析:初级程序员往往不需要自己创建抽象类,但是必须了解抽象类的概念,并且会使用抽象类。抽象类往往是设计阶段的概念,用来定义多个子类的模板,一些具体的实现可以在子类中进行。初级程序员往往需要会创建子类继承抽象类,实现抽象类中的方法。在API中,抽象类比比皆是。 
参考答案:抽象类是不能实例化的类,使用abstract修饰。抽象类往往用来做父类使用,定义一些子类的共同属性或行为。 
10、请说明抽象方法的含义,并说明抽象类与抽象方法的关系。 
解析:抽象方法都是在抽象类中定义的,是用来定义子类what to do的策略,而具体的how to do都在子类中实现。 
参考答案:抽象方法是没有办法体的方法,使用abstract修饰。抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。 
11、super关键字的两种用法。 
解析:使用一些IDE生成代码时,常常会在构造方法中见到super这个关键字。顾名思义,super是和父类有关的一个关键字,熟悉super的用法对熟练掌握继承很有必要。 
参考答案:如super():表示调用父类中的每一参考的构造方法:又如super(10);表示调用父类中的具有一个整型参数的构造方法。第二种用法是在子类中调用父类中的成员,如super.f();意思是调用父类中的f()方法。 
12、final类与final方法有什么作用? 
解析:final修饰符是一个用途非常广泛的修饰符,可以修饰类,方法,以及属性。 
参考答案:final类是不能够被继承的类,称为终极类,如String类就是final类,不能有子类。final修饰方法后,是终极方法,不能被子类覆盖,但是可以被子类继承使用。 
13.什么是多态函数?多态函数有什么用? 
解析:多态性是面向对象语言的的一大特征,重载,覆盖,多态参数是多态性的一种表现形式。多态参数处处可见,例如某方法f(Object o),这个方法的参数类型是Object,使用该方法时,只要传递给f的单数类型是Object即可。也就是说,Object类的任意参数可以传递给f方法。这就是多态参数。意思是对外形式都一样,都是Object,具体实现可以是这个类型的任意子类,这就使得该方法比较灵活,Object类即使有了新的子类,却不需要修改,就能直接作用到那个子类。了解多态参数的含义和使用,对于Java的使用特别关键。 
参考答案:多态函数就是参数的类型是某个父类类型,具体为这个参数赋值的不同以使用该父类的任意子类的对象。使用多态参数,可以使程序的扩展性更好,即使%%%%的子类方法不需要任何修改,就能接受子类类型进行处理。 
14.Object类有什么特点? 
解析:Object类是一个非常重要的类,是所有类的父类,包括数组在内,也就是对一个Java类,不管是API中定义的,还是自定义的类,都直接或间接的继承了Object类。所以,如果有一个方法f(Object o),那么可以传递给这个方法任意一个类的对象,包括%%%%。因为所有对象都可以说是Object类型。 
参考答案:Object类是多有类的直接或间接的父类。 
15.Object类中的toString方法有什么用? 
解析:Object类是所有类的父类,所以Object类中的方法是所有类都默认具备的。类中的toString 方法可以将任意一个对象作为字符串返回, API中很多类已经覆盖了这个方法,将其返回值的格式进行了自定义,如String类中的方法已经覆盖为返回字符串的字符序列。toString 方法在很多场合被自动调用,例如打印一个对象时,就自动调用该对象的toString 方法。 
参考答案:toString方法可以把对象作为字符串返回。 
16.Object类中的equals方法和hashCode 方法。 
解析:在Object类中,equals方法比较对象的引用值,也就是只有物理上是同一对象的两个引用,在使用equals方法返回true。hashCode方法返回一个对象的内在地址的十六进制值。由于Object类是所有类的父类,所以任意类中都拥有这两个方法,并都可以进行覆盖。尤其是操作Set,Map对象时集合元素类的equals方法和hashCode方法非常必要。 
参考答案:Oject类中的equals方法用来比较两个引用值,hashCode用来返回引用的内地址的十六进制数值。在Set以及Map集合中,判断两个元素是否重复时,往往需要使用这两个方法。这两个方法往往被子类覆盖,覆盖的规则是:如果存在x和y两个对象,调用x.equals(y)返回true时,那么调用hashCode方法的返回值也该相同;如果x.equals(y)返回false时,那么调用hashCode方法返回的值可能相同,也可能不同。 
17.接口有什么特点,与抽象类有什么区别? 
解析:接口的概念是一个设计层面的概念,初级程序员往往不会自己定义接口,但是会使用接口,理解接口的概念非常必要。接口定义了实现类的规范,即what to do的部分,所有实现类必须按照这个规范进行实现。 
参考答案:接口的特点是不能定义变量,而且所有方法都是抽象方法。而抽象类中可以有变量,也不强制必须有抽象方法。 
18.类继承父类与类实现接口,有什么区别? 
解析:类继承父类与类实现接口,本质上其实是一样的。都是将父类或者接口作为模板,在这个模板上进行扩展或者重写。程序员在实际编程中,常常需要继承父类或者实现接口。 
参考答案:类继承父类只是单继承,也就是一个子类最多只有一个父类;而类实现接口可以多实现,就是一个子类可以同时实现多个接口,并覆盖所有接口中的所有抽象方法。 
19.Comparable接口有什么作用 
解析:comparable接口是在实际编程中常常使用的接口,该接口定义了comareTo(Object o)方法,用来定义对象的比较逻辑。这个接口常常在其他API中会强制使用,例如Arrays类的sort(Object[])方法,就强制数组元素必须实现Comparable接口,与这个接口类似的 另外一个接口是Comparator。 
参考答案:Comparable接口定义了compareTo(Object o)方法,可以用来实现对象的比较逻辑,这个接口常常在其他API中强制使用,用来规范对象的比较逻辑 
第三部分 异常处理

1 .什么是异常?异常和错误有什么区别? 
解析:异常处理是面向对象语言比起过程式语言的一大改进。对于Java程序员来说,必须了解异常处理,才能顺利编程。 
参考答案:异常是一些不正常的事件,能够中断程序的正常执行例如才除0计算就是异常。和错误不同,异常是可以被处理的,而错误往往是不能够处理的,如内存溢出错误。 
2 .nullPointException是什么异常?什么情况发生该异常? 
解析:程序员必须能够了解常见的异常的发生原因,并能够处理。NullPointerException就是特别常见的运行期异常。 
参考答案:NullPointerExcepiton是空指针异常,当一个引用没哟被赋值,就是一null值如 
果这种情况下, 使用该引用调用其属性或者方法, 就会发生NullPointerException异常。 
3.说明try/catch/finally语句块的作用 
解析:编写Java程序,避免不了需要处理异常。Java中处理异常使用try/catch/finally来实现。尤其其中的finally语句非常值得程序员关注,可以用来执行必须实现的功能,例如数据库的链接等操作。 
参考答案:try语句块用来包含可能发生异常的语句,catch块用来捕获异常,finally用来包含必须执行的语句。 
4.如何使用语句抛出异常,抛出异常后如何处理? 
解析:某些业务逻辑的非正常事件流,可以使用抛出异常来标记。抛出的异常必须是有意义的异常类型,建议不要使用API中的标准异常类,避免混淆。 
参考答案:使用throw语句就可以抛出异常,如throw new XXXException()。抛出异常时一般情况下会在声明方法处使用throws声明该类型的异常,调用该方法是编译器将提示异常。 
5. throws 关键字和 throw 关键字有什么区别和联系? 
解析:throws和throw是异常处理时两个常见的关键字,初级程序员常常容易正确理解throw和throws的作用和区别,说明已经能比较深入理解异常处理。Throw用来抛出异常,如果执行了throw语句,程序将发生异常,进入到异常处理机制。Throws用来声明异常,说明这个方法可能会发生某些类型的异常,那么编译器将强制在调用这个方法的时候处理异常。API中的很多方法都使用了throws声明了异常,所以使用这些方法时编译器会提示需要处理异常。 
参考答案:throw用来在方法体内抛出异常,而throws用来在方法声明处声明异常。这两个关键字有着一定的联系。如果一个方法中使用了throw关键字抛出了异常,那么要么立即用try/catch语句进行捕获,要么就是用throws进行声明,否则将出现编译错误。然而, 
并不是只有使用了throw关键字之后才能使用throws关键字,语法上来说,任何一个方法都可以直接使用throws关键字,抽象方法也可以使用。 
6. 什么是自定义异常类?为什么要自定义异常类? 
解析:企业应用中,往往会自定义一系列的异常类,标记一些非正常的事件流。然而,这些自定义异常类不会让每个程序员都自定义,而是会由专人定义,分发给程序员使用。 
参考答案:自定义异常类区别于API中的标准异常类,指的是开发人员自己创建的异常类。只要继承API中某个异常类就可以自定义一个异常类,常常集成Exception类。自定义异常类主要是为了标记业务逻辑中非正常事件流,避免与API中的标准异常混淆。 
第四部分 核心API 
1. 请画出Java集合框架的主要接口和类的继承关系。 
解析:集合石非常重要的类型, 也是企业考察员工编程能力时常常关注的知识点。程序员应该熟悉Java集合框架的主要继承关系, 掌握常用集合类的用法和特点

  1. Collection接口和Map接口分别定义了什么集合类型?有什么区别? 
    解析:Collection和Map是Java集合框架中两个基本集合类型,要区别不同的集合首先要从Collection和Map开始。 
    参考答案:Collection接口是传统的集合接口,可以把单个对象存储进来。而Map接口是映射接口,存储的是键值对。
  2. 用简单代码演示创建一个泛型类为Customer类的List对象,并使用增强for循环迭代集合。 
    解析:JDK5以后,集合框架中的接口和类都是泛型类及泛型接口,并可以使用增强for循环迭代集合。程序员需要确认开发平台的JDK版本,如果低于5.0则不能使用这些功能。 
    参考答案: 
    ArrayList list = new ArrayList(); 
    For(Customer c : list){

}

4.List和Set集合有什么区别? 
解析:List和Set是Collection接口的两个子接口,也是使用最多的两种集合类型。程序员应该熟悉这两个接口的基本特征,能够更准确地选择正确的集合类型。 
参考答案:List实现了列表类型的集合,List中的元素是有序(ordered)的,每个元素根据放入集合的顺序而对应一个索引值, 可以根据这个索引值返回集合原宿。而Set实现了不重复元素集合,即Set中的元素不能够重复,重复的元素将无法添加到集合中。 
5. List接口有哪几个实现类?分别说明其特征 
解析:List是用的较多的集合类型,List是一个接口,具体使用List集合类型时,需要使用时实现类。List接口的每个实现类也都实现了不同的数据结构,各自具有不同的特征,其中最常用的是List实现类。 
参考答案:List接口中有以下几个常用实现1 ArrayList:实现了动态数组的特征。 
2 LinkedList: 实现了链表的数据结构,LinkedList也可以用作栈或者队列。3 Vector:向量。4 ArrayList Vector类的功能 ArrayList都可以实现,区别在于Vector是现行同步的。 
6. Collectioin 和Collections有什么区别? 
解析:很多初级程序员对Collectioni和Collections容易混淆,二者的名字非常类似,本义却大大不同,Collections类与Arrays类非常类似,都是工具类,程序员应该熟悉掌握。 
参考答案:Collection是一个接口的名字,定义了集合类型的共同特征。而Collections是一个类的名字,是集合类型的工具类,类中定义了大量的静态方法,能够操作及和对象。 
7. 如何将一个Collection转换成数组? 
解析:集合和数组有很多共同的地方,二者都是作为数据容器使用, 用来持有数据。数组的长度是固定的,集合的长度却可以动态扩展,数组由于可以直接通过索引操作其元素,所以性能和效率较高。实际应用中,可能使用及合作为临时变量持有数据,却将处理结果转换成数组返回。 
参考答案:Collection接口中定义了toArray(T[] a)方法来将集合转换为数组,其中T是泛型类型。

8 集合的作用? 
集合是可以存储一批类型不同的对象, 
针对集合的实现类有很多, 
作用都是一样的,即存储、传输数据,但存储的数据结构不一样,其速度、安全性也 
不一样。

9 HashMap和TreeMap在性能上有什么样的差别呢?你比较倾向于使用哪一个? 
一个平衡树的性能是O(logn)。Java里的TreeMap用一个红黑树来保证key/value的排序。红黑树是平衡二叉树。保证二叉树的平衡性,使得插入,删除和查找都比较快,时间复杂度都是O(log n)。不过它没有HashMap快,HashMap的时间复杂度是O(1),但是TreeMap的优点在于它里面键值是排过序的,这样就提供了一些其他的很有用的功能。

10 什么是Iterator 
一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。

11 什么是HaspMap和Map? 
Map是接口,Java 集合框架中一部分,用于存储键值对,HashMap是用哈希算法实现Map的类

12 Java集合框架都有哪些最佳实践呢? 
根据实际的使用情况选择合适的数据结构,例如固定大小的还是需要增加大小的,有重复元素的还是没有的,需要保持有序还是不需要,遍历是正向的还是双向的,插入是在末尾的还是任意位置的,更多的插入还是更多的读取,是否需要并行访问,是否允许修改,元素类型是相同的还是不同的,等等。另外,还需要尽早考虑多线程,原子性,内存使用量以及性能等因素。 
不要假设你的集合里元素的数量一直会保持较小,它也有可能随着时间增长。所以,你的集合最好能够给定一个合适的大小。 
针对接口编程优于针对实现编程。例如,可能在某些情况下,LinkedList是最佳的选择,但是后来ArrayList可能因为性能的原因变得更加合适 
在取得列表的时候,如果返回的结果是空的话,最好返回一个长度为0的集合或者数组,而不要返回null。因为,返回null的话可能能会导致程序错误。调用你的方法的开发人员可能会忘记对返回为null的情况进行处理。 
封装好集合:一般来说,集合都是不可变的对象。所以尽量不要把集合的成员变量暴露给调用者。因为他们的操作一般都不会进行必要的校验。

13 ArrayList和Vector的区别。 
同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 .数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

14 ArrayList、Vector、LinkedList的区别?   
 ArrayList、Vector:以线性表的方式存储,查、改快,增删慢    Vector:是线程安全,方法是同步方法  。  
 ArrayList:是线程不安全,方法是非同步方法 。 
LinkedList:单链表,查、改慢,增删快

15 Map的接口和特点?:  
键名+键值,键名不可以重复,键值可以重复,通过键名取键值  
  HashMap:线程不安全   Hasttable:线程安全   jsp中的作用域对象(session、request、application、page)属于map这个体系

16 Collection及Collections的区别?   
 Collection是集合的根   Collections是算法,提供了静态方法,可以对集合进行操作

17 假设存在文本文件etc.doc,请用代码展示将文件按行读出,并打印输出到控制台。 
解析:能够使用java.io包进行文件的输入输出操作是一个程序员必备的技能,使用io中类操作的步骤都基本类似,都需要经历IO选择、创建流对象、进行读写操作、关闭流对象的过程,程序员应该熟悉常用的IO流, 能够根据需要选择适当的IO类。 
参考答案: 
File file = new File(“etc.doc”); 
try{ 
FileReader fr = new FileReader(File); 
BufferedReader br = new BufferedReader(fr); 
String line = br.readLine(); 
while(line == null){ 
System.out.println(line); 
Line = br.readLine(); 

}catch(FileNotFoundException e){ 
e.printStackTrace(); 
}catch(IOException e){ 
e.printStackTrace(); 
};

18.使用java语言如何创建线程对象?请列出常用的两种方法。

解析:Java 语言能够支持多线程编程,将线程封装成Thread类型的对象,只要创建Thread类型的对象,就能够便捷地启动线程、执行线程体。程序员首先必须掌握创建线程的常用方法。 
参考答案:Java语言中经常使用两种方法创建线程。①创建Thread类的子类,在子类中覆盖Thread类的run方法,实现线程的运行体,只要创建该子类对象就是线程对象。②创建Runable接口的实现类,在实现类中覆盖接口中的run方法,实现线程的运行体。使用Thread(Runable)构造方法可以创建线程对象,参数是Runable接口实现类的实例。 
19.关键字synchronized有什么作用?用简单代码展示synchronized的方法。 
解析:线程可以共享数据,而共享数据时,可能会因为多个线程并发处理共享数据而导致数据不一致。这种时候,线程同步就费城关键。程序员必须掌握同步的用法,尤其不能随意将代码进行同步,因为同步将降低性能,所以一定不能把不需要同步的代码进行同步,而是只把必须同步的代码进行同步。 
参考答案:synchronized可以将某个代码块或者某个方法进行线程同步,被同步的代码块在一个时刻只能被一个线程访问,只有当前线程处理结束后,方能被其他线程访问。例如: 
public void run(){ 
for(int i=0;i<50;i++){ 
synchronized(this){ 
System,out,println(Thread.currentThread().getName()+”:x=”+x); 
X++; 
}}}

  1. 线程之间通信的方法有哪几个?分别起到什么作用?

解析:如果多个线程共享了某些数据,同时线程之间有存在一定的“依赖”关系,即执行某类线程必须依赖另一类的执行结果,如消费者必须等待生产者生产了商品才能消费。这种情况下,线程之间就需要通信。必须在同步代码块中调用线程通信的方法。 
参考答案:线程通信的方法有三个,在Object类中定义。①wait方法:使得线程进入等待状态。②notify 方法:随意通知等待池中的某一个线程。③notifyAll 方法:通知等待池中所有线程。 
第五部分 其 他 特 性 
1.什么是泛型?泛型有什么作用? 
解析:泛型是JDK5中增加的特性,API中有大量的泛型接口、泛型类及泛型方法等。程序员需要了解泛型的作用,尤其在使用集合框架时,往往需要使用到泛型。 
参考答案:泛型的本质就是参数化类型,也就是说把数据类型指定为一个参数。在需要声明数据类型的地方,就可以不指定具体的某个类型,而是使用这个参数。这样一来,就能够在具体使用时再指定具体类型,实现了参数的“任意化”。泛型的好处是在编译的时候能够检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

2.请声明一个简单的泛型类,说明泛型的作用 
解析:泛型可以用在很多地方,可以声明泛型类、泛型接口、泛型方法等。其中泛型类的使用时程序员必须掌握的知识点。

参考答案: 
public class GenClass{ 
private E attr; 
public GenClass(E attr){ 
this.attr=attr; 

public E getAttr(){ 
return attr; 

public void setAttr(E attr){ 
this.attr=attr; 

public static void main(String[] args){ 
GenClassg1=new GenClass(“hello”); 
System.out.println(g1.getAttr()); 
GenClassg2=new GenClass(new Interger(100)); 
System.out.println(g2.getAttr()); 
}}

上面的类GenClass就是一个泛型类,其中E是代表类型的一个参数,E不是一个具体的类,可以使用任意字母代替。在类中声明属性、方法的时候,都使用E这个参数表示类型,达到了类型任意化的效果。可见,使用该类时,可以根据需要将E替换为任意具体类型。 
3.下述代码是否有编译错误,如果有,请指出错误。 
ListIs=new ArrayList(); 
ListIo=Is;

解析:Object类是Java中的*类,是所有类直接或间接的父类。然而,继承关系在使用泛型集合时,却非常容易出错,程序员必须谨慎使用。例如,虽然String类型是Object类型的子类型,然而一个泛型类型为String的List并不是一个泛型类型为Object的List的子类型。 
参考答案:代码有编译错误,在第二行出错。一个泛型类型为String的List并不是一个泛型类型为Object的List的子类型。

4.请使用简单代码声明一个枚举类型,并说明枚举的作用。

解析:枚举是JDK5版本增加的新类型,在这之前,只有类和接口两种类型。枚举类型主要能够解决静态常量的类型不安全问题。例如,某类中有一系列int型的静态常量,并都赋予了特定的值。然而在使用这些常量时,完全可以用任意一个int型的值代替,编译器不会发现错误。而枚举作为一种类型存在,编译器将在编译期检查类型,不能随意使用其他值代替,当应用中需要一系列预定义的常量值时,程序员就应该考虑是否使用枚举实现。 
参考答案:枚举使用enum关键字声明,如下所示: 
public enum StudentGrade{ 
A,B,C; 

使用枚举的时候,可以通过枚举的名字StudentGrade进行引用,如下所示: 
public void setGrade(StudentGrade grade){ 
this.grade = grade; 

在使用setGrade 方法时,实际参数值只能是枚举 StudentGrade 中的预定义值,否则将出现编译错误。

5.假设有一个枚举类型是Grade,使用代码展示遍历该枚举的方法。

解析:枚举中往往定义了一系列的数据点,在某些场合下可能需要遍历这些值。程序员应该掌握遍历枚举的方法。 
参考答案:遍历枚举需要使用values()方法,如下所示: 
Grade[]grades = Grade.values(); 
for(Grade g : grades){ System.out.println(g); 
}

6.增强for循环再什么场合使用?用简单代码展现其使用方法。 
    
解析:增强for循环式JDK5版本增加的特性,只能在遍历数组或集合时使用。遍历集合时,最好使用泛型集合,否则将比较复杂。增强for循环并不能完全替代传统循环,如果不是遍历数组或集合,还是只能使用传统的for循环。

参考答案:增强for循环可是用来遍历数组或集合,如下所示:

for(String s:sArray){ 
System.out.println(s); 
}

上述代码中的sArray是一个String类型的数组。 
  
7.什么是自动装箱/拆箱?使用该特征有哪些注意事项? 
  
解析:自动装箱/拆箱指的是八个包装器类与八个基本类型的转换问题。然而。这个特征却需要谨慎使用,因为虽然表面上看起来非常方便,而实质上依然需要创建对象、进行转换等操作,使用不恰当会降低性能。

参考答案:自动装箱指的是可以直接将基本数据类型转换为包装器类型,自动拆箱指的是可以直接将包装器类型转换为基本数据类型,如下代码所示: 
int m=100; 
Integer im=m; 
int n=im;

上诉代码中,直接将m赋值给包装器对象im,这就是自动装箱,然后直接将im赋值给基本数据类型n,这就是自动拆箱。虽然表面上看代码简洁方便,然而本质上装箱时候依然使用new创建了对象,而拆箱时也依然调用了方法进行运算。因此,不要在没有必要的时候,频繁使用装箱拆箱,会降低性能。

8.什么是可变参数?用简单代码展示可变参数的使用。 
解析:如果一个类中的某个方法,要接受某个类型的参数,而参数个数却不确定,这种情况下,可以将这个参数使用数组类型或者集合类型封装,然而使用该方法时就比较麻烦,必须先把参数先封装成数组或者集合。可变参数就能够解决这个问题。 
参考答案:可变参数是指参数个数不确定的参数,如下所示: 
public static int add(int..args){ 
………… 

上述方法的args就是可变参数,使用add方法时,形式参数可以是任意多个int型数值。

1、作用域public,private,protected,以及不写时的区别 
答:区别如下: 
作用域 当前类 同一package 子孙类 其他 package 
public √ √ √ √ 
protected √ √ √ × 
friendly √ √ × × 
private √ × × × 
不写时默认为friendly2、 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类, 
是否可以implements(实现)interface(接口) 
答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作 
为一个接口,由另一个内部类 
实现 
2、&和&&的区别 
答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 
5、Collection 和 Collections的区别 
答:Collection是集合类的上级接口,继承与他的接口主要有 Set 和List. 
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作 
6、什么时候用assert 
答: assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个boolean表达式的值为 true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说, assertion用于保证程序最基本、关键的正确性。assertion 检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的 
7、String s = new String(“xyz”);创建了几个String Object 
答:两个,一个字符对象,一个字符对象引用对象 
8、Math.round(11.5)等於多少? Math.round(-11.5)等於多少 
答: Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回与参数最接近的长整数 
10、Java有没有goto 
答:java中的保留字,现在没有在java中使用 
11、数组有没有length()这个方法? String有没有length()这个方法 
答:数组没有length()这个方法,有 length的属性。String有有 length()这个方法 
12、Overload和Override的区别。Overloaded 的方法是否可以改变返回值的类型 
答:方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽” 了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型, 
则称为方法的重载 (Overloading)。Overloaded的方法是可以改变返回值的类型 
13、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它们有何区别
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等 equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值 
14、给我一个你最常见到的 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 
15、error和exception有什么区别 
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况 
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况 
16、List, Set, Map是否继承自 Collection接口 
答: List,Set是,Map不是 
17、abstract class和interface 有什么区别 
答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。 Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法 
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义 static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口 
18、 abstract的method 是否可同时是static,是否可同时是 native,是否可同时是synchronized 
答:都不能 
19、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class) 
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数 
20、构造器Constructor 是否可被override 
答:构造器Constructor 不能被继承,因此不能重写Overriding,但可以被重载Overloading 
21、是否可以继承String类 
答:String类是final类故不可以继承 
22、try {}里有一个return语句,那么紧跟在这个try后的 finally {}里的 code会不会被执行,什么时候被执行,在return 前还是后 
答:会执行,在return前执行 
23、用最有效率的方法算出 2乘以8 
答:2 << 3 
24、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对 
答:不对,有相同的hash code 
25、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 
答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的 
26、switch是否能作用在byte 上,是否能作用在long上,是否能作用在String上 
答:低版本jdk中witch(expr1)中,expr1 是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于 swtich。在高版本jdk中,String类型也可以用在switch中。 
27、ArrayList 和 Vector 的区别,HashMap 和Hashtable的区别 
答:就ArrayList与Vector主要从二方面来说. 
一.同步性:Vector 是线程安全的,也就是说是同步的,而 ArrayList 是线程序不安全的,不是同步的 
二.数据增长:当需要增长时,Vector默认增长为原来一培,而 ArrayList却是原来的一半 
就HashMap与 HashTable主要从三方面来说。 
一.历史原因:Hashtable 是基于陈旧的Dictionary 类的,HashMap是Java 1.2引进的 Map接口的一个实现 
二.同步性:Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的, 
不是同步的 
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

28、char 型变量中能不能存贮一个中文汉字?为什么? 
答:是能够定义成为一个中文的,因为 java中以 unicode 编码,一个char 占16 个字节,所 
以放一个中文是没问题的 
29、GC是什么? 为什么要有 GC 
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会 导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 
30、float型float f=3.4是否正确? 
答:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 
31、介绍JAVA 中的Collection FrameWork(包括如何写自己的数据结构)? 
答:Collection FrameWork如下: 
Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMapCollection 是最基本的集合接口,一个 Collection 代表一组 Object,即Collection的元素(Elements) 
Map提供key到value的映射 
32、抽象类与接口? 
答:抽象类与接口都用于抽象,但是抽象类(JAVA中)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)。 
33、STRING与STRINGBUFFER 的区别。 
答:STRING 的长度是不可变的,STRINGBUFFER 的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的 toString()方法 
34、谈谈final, finally, finalize 的区别 
答:final—修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract 的,又被声明为 final 的。将变量或方法声明为 final,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能 使用,不能重载 finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象 之前对这个对象调用的 
35、面向对象的特征有哪些方面 
答:主要有以下四方面: 
1.抽象: 
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 
2.继承: 
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现 有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类 的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需 
要。 
3.封装: 
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以 被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 
4. 多态性: 
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽 象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 
36、String是最基本的数据类型吗 
答:基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer 类 
37、int 和 Integer 有什么区别 
答:Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int 是 java 的原始数据类型,Integer是java 为int 提供的封装类。Java为每个原始类型提供了封装类。 
原始类型封装类 , 
booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺 省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关 
38、运行时异常与一般异常有何异同 
答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中 
可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 
39、说出ArrayList,Vector, LinkedList的存储性能和特性 
答:ArrayList和Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许 直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized方法(线程安全),通常性能上较 ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要 进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 
40、HashMap和Hashtable 的区别 
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了 Map接口, 
主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于 ashtable。 HashMap允许将null作为一个entry 的key 或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary 类,而HashMap是 Java1.2 引进的Map interface 的一个实现。 最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问Hashtable时,不需要自己为它的方 
法实现同步,而HashMap 就必须为之提供外同步。 
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 
41、heap和stack有什么区别 
答:栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成 元素 
42、Java中的异常处理机制的简单原理和应用 
答:当 JAVA 程序违反了 JAVA 的语义规则时,JAVA 虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一 种是JAVA 类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发 
NullPointerException。另一种情况就是 JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并*选择在何时用throw 关键字引发异常。所有的异常都是 java.lang.Thowable 的子类。 
43、垃圾回收的优点和原理。并考虑 2种回收机制 
答:Java语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼的内存管理的问题迎刃而解,它使得 Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独 的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能 实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 
44、你所知道的集合类都有哪些?主要方法? 
答:最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作”键”和”值”),其中每个键映射到一个值。 
45、描述一下JVM加载 class文件的原理机制? 
答:JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 
46、排序都有哪几种方法?请列举 
答: 排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序) 
47、JAVA 语言如何进行异常处理,关键字: 
throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常 吗? 
答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都 是一个对象,它是Throwable 类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过 5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候 你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try 来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。 throws用来标明一个成员函数可能抛出的各种”异常”。Finally为确保一段代码不管发生什么”异常”都被执行一段代码。可以在一个成员函数调用的外面写一个 try 语句,在这个成员函数内部写另一个 try 语句保护其他代码。每当遇到一个 try 语 句,”异常”的框架就放到堆栈上面,直到所有的 try 语句都完成。如果下一级的 try 语句没有对某种”异常”进行处理,堆栈 就会展开,直到遇到有处理这种”异常”的try语句。 
48、一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制? 
答:可以。必须只有一个类名与文件名相同。 
49、java中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
答:字节流,字符流。字节流继承于 InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter 。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。 
50、java中会存在内存泄漏吗,请简单描述。 
答:会。自己实现堆载的数据结构时有可能会出现内存泄露,可参看effective java. 
51、java中实现多态的机制是什么? 
答:方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding是父类与子类之间多态性的一种 表现,重载Overloading是一个类中多态性的一种表现。 
52、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收 
答:对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用 
情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC 就有责任回收这些内存空间。可以。程序员可以手动执行 System.gc(),通知GC运行,但是Java语言规范 并不保证GC一定会执行。 
53、静态变量和实例变量的区别? 
答:static i = 10; //常量 class A a; a.i =10;//可变 
54、什么是java序列化,如何实现 java序列化? 
答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可 
以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,implements Serializable 只是 为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流) 对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。 
55、是否可以从一个static方法内部发出对非static方法的调用? 
答:不可以,如果其中包含对象的 method();不能保证对象初始化. 
56、写clone()方法时,通常都有一行代码,是什么? 
答:Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。 
57、在JAVA中,如何跳出当前的多重嵌套循环? 
答:用break; return 方法。 
58、List、Map、Set三个接口,存取元素时,各有什么特点? 
答:List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value 值,value 可多值。 
59、说出一些常用的类,包,接口,请各举5 个 
答:常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer 
常用的包:java.lang java.awt java.io java.util java.sql 
常用的接口:Remote List Map Document NodeList 
60、java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和 suspend()方法为何不推荐使用? 
答:有两种实现方法,分别是继承 Thread类与实现Runnable接口 
用synchronized关键字修饰同步方法 
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程 能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被”挂起” 的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所 以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂 起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个 notify()重新启动线程。 
61、sleep() 和 wait() 有什么区别? 
答:sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持, 到时后会自动恢复。调用 sleep不会释放对象锁。 wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 
62、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 
答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程 写过了,那么这些数据就是共享数据,必须进行同步存取。 
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 
63、启动一个线程是用 run()还是start()? 
答:启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。 这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 
64、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 
答:不能,一个对象的一个 synchronized方法只能由一个线程访问。 
65、请说出你所知道的线程同步的方法。 
答:wait():使一个线程处于等待状态,并且释放所持有的对象的 lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 
66、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 
答:多线程有两种实现方法,分别是继承Thread类与实现 Runnable 接口 
同步的实现方面有两种,分别是 synchronized,wait 与 notify 
67、线程的基本概念、线程的基本状态以及状态之间的关系 
答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。 
Java中的线程有四种状态分别是:运行、就绪、挂起、结束 
68、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 
答:主要相同点:Lock能完成synchronized所实现的所有功能 
主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而Lock一定要求程序 员手工释放,并且必须在 finally从句中释放。

Jdbc方面

69、Class.forName的作用?为什么要用? 
答:调用该访问返回一个以字符串指定类名的类的对象。 
70、Jdo是什么? 
答:JDO是Java对象持久化的新的规范,为 java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化 API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到 JDO 产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC 只是面向关系数据库(RDBMS)JDO 更通用,提供到任何数据底层的存储功能, 比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。 
71、说出数据连接池的工作机制是什么? 
答:J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程 序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的 数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

Xml方面

72、xml有哪些解析技术?区别是什么? 
答:有DOM,SAX,STAX等 
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由 DOM的树结构所造成的,这种结构占用的内存较多,而且 DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取 XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML (StAX) 
73、你在项目中用到了 xml技术的哪些方面?如何实现的? 
答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩 打包加密后通过网络传送给接收者,接收解密与解压缩后再同 XML 文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。 
74、XML文档定义有几种形式?它们之间有何本质区别?解析 XML 文档有哪几种方式? 
答:a: 两种形式 dtd schema,b: 本质区别:schema本身是xml的,可以被XML 解析器解析(这也是从DTD上发展 schema的根本目的),c:有DOM,SAX,STAX等 
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由 DOM的树结构所造成的,这种 
结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对 XML 的随机访问 
SAX:不现于DOM,SAX 是事件驱动型的 XML 解析方式。它顺序读取XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件, 适合对XML 的顺序访问STAX:Streaming API for XML (StAX) EJB 方面

J2EE,MVC方面

75、MVC的各个部分都有那些技术来实现?如何实现? 
答:MVC 是 Model-View-Controller 的简写。”Model” 代表的是应用的业务逻辑(通过JavaBean,EJB 组件实现),”View” 是应用的表示面(由 JSP页面产生),”Controller” 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。 
76、J2EE 是什么? 
答:Je22 是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web 层和组件,Business层和组件,企业信息系统(EIS)层。