【Interview】【Java】Java工程师面试篇#2

来源:互联网 发布:pscad软件正版价格 编辑:程序博客网 时间:2024/06/06 00:41


个人能力有限,答案可能难免有不全之处,敬请谅解!


1、是否可以继承String类?


答:String类是final类,不允许被继承。

public final class String    implements java.io.Serializable, Comparable<String>, CharSequence {...}


2、ArrayList、Vector的区别以及Hashmap、Hashtable区别


ArrayList、Vector的区别


数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的


Hashmap、Hashtable区别


1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,

不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。

但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。

因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。


3、GC是什么?为什么要有GC?


GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,

忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以

自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已

分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行

管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() Runtime.getRuntime().gc()。


4、抽象类(abstract class)和接口(interface)有什么区别?


声明方法的存在而不去实现它的类被叫做抽象类(abstractclass),它用于要创建一个体现

某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类

的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。

不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,

否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现

这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的

接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员

变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,

它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象

上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将

生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类

是否实现了接口。


5、作用域public、private、protected以及不写时的区别


public:所有其他类均可访问

private:仅该类本身可以访问

protected:本包中其他类和所有其他包中的子类可以访问

不写时:本包中的类可以访问


6、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?


答:方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。



7、常用的异常有哪些?举例子说明。


答:大分为,Error和Exception

(1)Error类认为是不能恢复的严重错误,如系统内部错误和资源耗尽错误;此类错误程序几乎是无能为力,

不应该抛出这类型的错误,而是让程序中断;

(2)Exception类可能是一些轻微错误,这里分为派生自RuntimeException和非派生自RuntimeException类;

区分RuntimeException和非RuntimeException的规则:

编程错误导致RuntimeException,如,被0除、数组越界访问、空指针访问等等;而其他异常则是由于意外

情况发生,如:试图打开一个错误的URL,试图根据并不代表已存在类的字符串来查找Class对象,

试图读取文件结尾以后的数据等等。


8、程序的输出结果是什么?


//test2.javaclass test1{  test1(){    aMethod();  }  public void aMethod(){    System.out.println("in test1 aMethod!");  }}public class test2 extends test1{  test2(){    aMethod();  }  public void aMethod(){    System.out.println("in test2 aMethod!");  }  public static void main(String args[]){    new test2();    new test1(); }}

答:输出两行“in test2 aMethod!",因为,在main函数中新建test2对象,会先调用test2继承了的

父类的构造函数test1(),然后再调用自身的构造函数test2();在test2对象调用test1()时候,

执行test1函数体重的aMethod(),这个时候,由于aMethod函数在test2中已经重写了,

因此这里输出的是”in test2 aMethod!",而不是“in test1 aMethod!”。

后面的调用就是一些普通的调用,一般不容易写错。

in test2 aMethod!in test2 aMethod!in test1 aMethod!

9、编程实现类:命令行输入10个整数,输出最大值和最小值。

/**输入10个整数,输出最大值和最小值*/import java.io.*;public class InputOutput{final int NumOfArr=10;int arrInt[]=new int[NumOfArr];public void setArrIntByInput(){try{//先使用System.in构造InputStreamReader,再构造BufferedReaderBufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));int index=0;while(index < NumOfArr){System.out.print("Enter a Integer:arrInt["+index+"]=");//将字符串解析为带符号的十进制整数arrInt[index]=Integer.parseInt(stdin.readLine());index++;}}catch(Exception e){System.out.println("IOException");}}public int getMaxOfArrInt(){int max=this.arrInt[0];for(int i=1;i<this.NumOfArr;i++){if(max < arrInt[i]){max=arrInt[i];}} return max;}public int getMinOfArrInt(){  int min=this.arrInt[0];for(int i=1;i<this.NumOfArr;i++){if(min > arrInt[i]){min=arrInt[i];}}return min;}public void printArrInt(){for(int i=0;i<this.NumOfArr;i++){if(i!=0 && i%5==0){System.out.print("\n");}System.out.print(arrInt[i]+"  ");}System.out.println();}public static void main(String args[]){InputOutput _InputOutput=new InputOutput();_InputOutput.setArrIntByInput();_InputOutput.printArrInt();int max=_InputOutput.getMaxOfArrInt();int min=_InputOutput.getMinOfArrInt();System.out.println("max:"+max);System.out.println("min:"+min);}}


0 0
原创粉丝点击