java面试题集锦
Posted fkx1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试题集锦相关的知识,希望对你有一定的参考价值。
第一,谈谈final, finally, finalize的区别。 最常被问到。
final:可以修饰非抽象类和非抽象类成员方法和变量
final类不能被继承,没有子类,final类中的方法默认是final
被声明为final的变量必须在申明时给定初始值,而在以后的应用中只能读,不能修改
finally:在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。
finalize:finalize是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是在垃圾收集器确认一个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此,所有的类都继承了它。子类覆盖finalize()方法已整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名内部类是没有名字的内部类,匿名内部类必须继承一个父类,或者实现一个接口,但最多只能继承一个父类,或实现一个接口。
当我们只需要用某一个类一次时,且该类从意义上需要实现某个类或某个接口,这个特殊的扩展类就以匿名内部类来展现。
由于匿名内部类没有名字,所以它没有构造函数。因为没有构造函数,所以它必须完全借用父类的构造函数来实例化,匿名内部类完全把创建对象的任务交给了父类去完成。
匿名内部类可以覆盖父类可以体现多态性
因为匿名内部类没有名字,所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型。
注意匿名内部类的声明是在编译时进行的,实例化在运行时进行。
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
static nested class 指静态嵌套类,或称嵌套类,是C++中常用的说法,inner class指内部类,是JAVA中的说法。
static nested class相当于inner class中的静态成员类。
(Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化)
第四,&和&&的区别。这个问得很少。
&和^,<<,<<<,|同属于位运算符,其中&是按位与,例如,1&1=1,1&0=0,&&是逻辑运算符,处理真假值,例如,true&&true=true。
第五,HashMap和Hashtable的区别。 常问。
hashmap是线程不安全的, hashtable是线程安全的。
hashmap的key和value都可以为NULL, hashtable不可以。
hashmap线程不同步, hashtable线程同步。
hashmap用enumerate遍历, hashtable用iterator遍历。
hashmap中hash默认数组大小是16,而且一般是2的指数,
hashtable中hash默认数组大小是11,增加方式是old*2+1。
计算index的方法不同, hashtable直接用hashcode()得出,hashmap对hashcode重新计算得出。
第六,Collection 和 Collections的区别。你千万别说一个是单数一个是复数。
collection是结合类的上级接口,子接口有List和Set等,Collections是java.util下的一个工具类,提供一些列静态方法对集合搜索排序线程同步化等。
第七,什么时候用assert。 API级的技术人员有可能会问这个。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出.一般来说,assertion用于保证程序最基本、关键的正确性.assertion检查通常在开发和测试时开启.为了提高性能,在软件发布后,assertion检查通常是关闭的.
第八,GC是什么? 为什么要有GC? 基础。
GC 即 garbage collection(垃圾收集),是JAVA用于回收内存的一种方式,主要的实现方法有引用计数,标记回收,复制清除等,GC可以避免内存泄露和堆栈溢出,有效提高内存的利用效率,同时将程序员从繁琐的内存管理中释放出来。
第九,String s = new String("xyz");创建了几个String Object?
两个。第一个对象是字符串常量"xyz" 第二个对象是new String("xyz")的时候产生的,在堆中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz" 另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;
floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;
round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11.
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1=1;s1+=1;有什么错?
面试题都是很变态的,要做好受虐的准备。
借鉴:https://blog.csdn.net/u013781343/article/details/80527142
第十二,sleep() 和 wait() 有什么区别?搞线程的最爱。
sleep()是java.lang.Thread中的静态方法,wait()是java.lang.Object中的方法;
wait和sleep区别: 分析这两个方法:从执行权和锁上来分析:
wait:可以指定时间也可以不指定时间。不指定时间,只能由对应的notify或者notifyAll来唤醒。
sleep:必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。
wait:线程会释放执行权,而且线程会释放锁。
Sleep:线程会释放执行权,但不是不释放锁。
sleep()必须捕获异常,而wait()不需要。
第十三,Java有没有goto?
很十三的问题,如果哪个面试的问到这个问题,我劝你还是别进这家公司。
goto是java的关键字,但java不支持goto,goto会影响程序的可读性,使逻辑显得混乱。
第十四,数组有没有length()这个方法? String有没有length()这个方法?
数组中没有length()这个方法,但有length这个属性。用来表示数组的长度。
String中有length()这个方法。用来得到字符串的长度。
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
常问。
Overload:重载
Override:重写
重载:同一个类中,方法名相同,参数列表个数不同。与返回值类型无关。
重写:存在于子父类,或者子父接口中,方法声明相同。
Overload的方法可以改变返回值的类型,因为它与返回值类型无关。
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。
为什么用equals呢?因为==是用来判断两者是否是同一对象(同一事物)或者说内存地址,而equals是用来判断是否引用同一个对象或者说值是否相同。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,
也就出现了重复元素。所以应该用equals()来判断。
第十七,给我一个你最常见到的runtime exception。
如果你这个答不出来,面试的人会认为你没有实际编程经验。
NullPointerException,空引用异常
ArithmeticException算数异常
第十八,error和exception有什么区别?
error就是严重的错误,像JVM产生的一些错误等,会停止程序运行或产生错误结果,程序员控制不了。exception是一定程度上可预见的错误,可以捕获以及处理。
第十九,List, Set, Map是否继承自Collection接口?
Set 和List 都继承了Conllection;Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像有的不同的List。实际上Set就是Collection,只 是行为不同。
Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
第二十,abstract class和interface有什么区别?
常问。
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类必须去实现。
3:抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstact方法需要子类重写,重写的概念是就实例方法而言, 所以不能是static。因为同一原因,要重写就不能native,native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢!抽象方法在抽象类中,无实例,不能被调用,也没有内容,所以synchronized没有意义。当然抽象方法在被子类继承以后,可以添加同步。
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。
抽象类可以实现(implements)接口。
抽象类可继承(extends)实体类,(但前提是实体类必须有明确的构造函数)。
类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法
第二十三,启动一个线程是用run()还是start()?
主要是启动start()简单的说start()中包含run()
第二十四,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload
第二十五,是否可以继承String类?
String类为final,不可被继承
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
有C背景的程序员特别喜欢问这种问题。
2<<3; 表示2 向左移 3位
2的二进制是0000 0010,左移3位后0001 0000
因为在计算机中逻辑运算符要比普通的+-*/计算的快
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
java语言的定义:
1) 对象相等则hashCode一定相等;
2) hashCode相等对象未必相等
(不一定,实践发现,equals相等,hashcode也一定相等,但在一定情况下不一定相等,但是不相等的情况为零)
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java编程语言中只有由值传递参数的。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
在Java 5以前,switch()中,只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,也可以是enum(枚举)类型,从Java 7开始,还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
第三十二,编程题: 写一个Singleton(单例)出来。
在单例模式中分为懒汉模式和饿汉模式
懒汉:
public class A{
private A(){}
private static A instance;
public statice A getinstance(){
If(instance==null){
instance=new A();
}
return instance;
}
}
饿汉:
public class B{
private B(){}
private statice B sing=new B();
public static B insten(){
return sing;
}
}
以上是关于java面试题集锦的主要内容,如果未能解决你的问题,请参考以下文章