java程序员面试题之32问

来源:互联网 发布:战舰世界 战列舰 知乎 编辑:程序博客网 时间:2024/05/01 23:35

原博客位置:http://blog.csdn.net/qq_35712465/article/details/78647425  作者:想念熊 翻译

感谢翻译!

这个应该才是初始版吧!之前看到其他人的一份,写着原创?!  

一,谈谈final, finally, finalize的区别。 
  final—修饰符(关键字) 修饰类,则该类不能被继承;修饰方法,不能被重写;修饰成员变量,不能被二次赋值(所以说必须                                           给定初始值);
不能和abstract同时使用;

  finally—专门用于在try-catch块之后,一般用于关闭某些流之类的。
  finalize—方法名。专门用在垃圾回收机制的时候;每一个对象都有一个finalize()方法;

                 当回收对象的时候,在进行可达性分析后发现没有与GC Roots相连接的引用链,会被第一次标记且进行一次筛选,筛                    选的条件就是是否有必要执行该方法,当对象没有覆盖该方法或者已经被调用过,就不会再执行该方法了;该方法是对                  象逃脱死亡的唯一办法

二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接                  口)?

   匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
  
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否               有指向外部的引用上。

   静态内部类(Inner Class)意味着创建一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的一个对              象访问一个外部类对象
  Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现

  HashMap允许将null作为一个entry的key或者value,而Hashtable不允许

  还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让             人引起误解。

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在 
      多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 
         就必须为之提供外同步。

四,&和&&的区别。
  &是位运算符;不管前面对与错,后面都参与运算。

      &&是布尔逻辑运算符;只要前面第一个为true,则后面的就不进行运算。
五,HashMap和Hashtable的区别。
  1、HashMap和Hashtable都是Map接口的实现类

       2、Hashtable是线程安全的,而HashMap是线程不安全的;

       3、HashMap允许key-value作为null值,但是Hashtable不允许

       4、HashMap是采用的快速安全失败机制来进行访问的


六,Collection 和 Collections的区别。
    都是java.util包下面的

                          ---  Collections是类,它包含有各种有关集合操作的静态方法。

                         ---   Collection是接口,它是各种集合的父接口.
七,什么时候用assert。
   断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的: 
  assert(a > 0); // throws an AssertionError if a <= 0 
  断言可以有两种形式: 
  assert Expression1 ; 
  assert Expression1 : Expression2 ; 
  Expression1 应该总是产生一个布尔值。 
  Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
  断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记: 
  javac -source 1.4 Test.java
  要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。 
  要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。 
  要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 
  可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。  

八,GC是什么? 为什么要有GC? 
  GC是垃圾收集器。Java 程序员不需要担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方          法之一: 
  System.gc()
  Runtime.getRuntime().gc()

九,String s = new String("xyz");创建了几个String Object?
   两个对象,一个是“xyx”;一个是指向“xyx”的引用对象s。
十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
  Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11


十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。         short s1 = 1; s1 += 1正确。


十二,sleep() 和 wait() 有什么区别?
 wait();不一定需要指定等待时间;释放执行权的时候释放锁

   sleep():必须指定等待时间;释放执行权,但是不会释放锁;从运行状态变为临时阻塞状态


十三,Java有没有goto?

 有,作为java的保留字存在


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


十五,Overload(重载、过载)和Override(重写、覆盖)的区别。Overloaded的方法是否可以改变返回值的类型?
   重写是父类与子类之间多态性的一种表现,重载是同一个类中多态性的一种表现

       override(重写)是覆盖了一个方法并且对其重写,以求达到不同的作用。

       overload(重载)它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,                      JVM就会根据不同的参数样式,来选择合适的方法执行。

        Overload(重载)的方法是可以改变返回值的类型。


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


十七,给我一个你最常见到的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
十八,error和exception有什么区别?
    error 表示统错误或低层资源的错误,总是不可被控制的。比如说内存溢出。
  exception 表示一种设计或实现问题。 程序员导致的错误,比如算数异常等。 


十九,List, Set, Map是否继承自Collection接口?
  List,Set是
  Map不是
  

二十,abstract class和interface有什么区别?
  

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

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

类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,           类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。

Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者是 public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。

 

二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
   都不能


二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
   接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
  

二十三,启动一个线程是用run()还是start()?
  启动线程使用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。START()是方法,它调用RUN()方法.而RUN()方法是你必须重写的. run()方法中包含的是线程的主体

二十四,构造器Constructor是否可被override(重写)?
    重写是发生在父类与子类之间的事情,然而
构造器Constructor不能被继承,因此不能重写,但可以被重载


二十五,是否可以继承String类?
    String类是final类故不可以继承。

public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence

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

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

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

             


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


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


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


三十二,编程题: 写一个Singleton出来。

//恶汉式
class singeleton{
   //1.私有化构造器,让在这个类的外部类不能调用这个构造器
private  singeleton(){
}
//2、创建这个类的对象,因为构造器被私有化,外部类是不能再 对这个类创建对象,所以只能本类自己创建对象
//因为这个对象是放在属性的位置,所以可以进行私有化,提供对外的方法,让外部类通过方法来调用这个对象
private  static singeleton  instence=new singeleton();
    //3.私有化此instance对象,通过公共的方法来调用
   //4.此公共的方法,只能通过类来调用,因为设置为static的,同时类的的实例也必须为static
public static singeleton getSingeleton(){//返回类型是singeleton***********调用对象的只能是方法或者类,因为这个类中
                                    //的对象被私有化,只能 是通过类来进行访问,那么就要对这个类进行静态化static修饰
                                    //这个方法的作用就是返回对象instence

return instence;
}
}

***************************************

//懒汉式
class singeleton2{
private singeleton2(){

}
private static singeleton2  instence2=null;
public static singeleton2 getSingeleton(){
if(instence2!=null){
instence2=new singeleton2();
}
return instence2;
}
 
}