java程序员面试题之32问

一,谈谈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 表示一种设计或实现问题。 程序员导致的错误,比如算数异常等。 

我有一个扣扣群,群里不定期分享技术干货,行业秘闻,汇集各类奇妙好玩的话题和流行动向!如果你喜欢我的分享,可以用扣扣搜索650385180加群关注。

十九,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 Stringextends Objectimplements 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;

}

}

要朝这java程序员发展或者真心有兴趣的。可以找我要一些java的学习视频java架构交流群:650385180,这个是免费的,希望同学找我要的时候不要有理所应当的态度,毕竟都是我的心血,希望你是真的有一颗想要学好java的心,我也会尽所能的去帮助你成为一名优秀的程序员。

猜你喜欢

转载自my.oschina.net/u/3778089/blog/1629792