首页 > 程序开发 > 软件开发 > Java >

一些Java面试题深入分析

2014-07-06

一、&和&&的区别? &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。 &&还具有短路的功能,即如果

一、&和&&的区别?

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33& ++y>0) y会增长,If(x==33 && ++y>0)不会增长

&不具有短路性质,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式依然会执行,所以会出现NullPointerException,除此之外,&还可以用作位运算符。

二、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

在switch(expr1)中,expr1可以是 byte, char, short,int 以及它们的包装类 Byte ,Character, Short, Integer,还有enum(枚举)、String(JavaSE 7增加的)

参考官网http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

三、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

final StringBuffer a=new StringBuffer(immutable);
执行如下语句将报告编译期错误:

a=new StringBuffer();
但是,执行如下语句则可以通过编译:

a.append( broken!);

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final StringBuffer param)

{

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append(a);


四、当执行String str=new String(abc);时,到底创建了多少个String对象?

如果再网上搜答案,几乎都是这样回答的:

如果String pool没有abc这个字符串 的话就在字符串池创建abc的对象,再是在堆里创建一个abc的对象,把堆里的abc对象地址返回给str 这个情况是创建2个对象,否则就只有在堆里创建一个abc的对象

可是,我今天看到一个讲解视频,他说任何情况都只创建一个String对象。任何情况都不会在字符串池创建abc的对象,论据:

		String s1=hjk;
		String s2=s1.intern();        //intern()的作用是如果在常量池中存在s1的字符串值“hjk”,则
					     //返回该字符串对象,否则在常量池添加“hjk”,并把该字符串对象返回。
		System.out.println(s2==s1);   //true
		String s3=new String(abc);
		String s4=s3.intern();
		System.out.println(s3==s4);  //false
		
		String s5=s3.intern();
		System.out.println(s5==s4);  //true

相关文章
最新文章
热点推荐