Java面试题自用收集
1.switch语句能否作用在Byte上,能否作用在Long上,能否作用在String上?
在switch(example)中,example只能是一个整数表达式或枚举常量,整数表达式可以是Int基本类型或者Integer包装类型, 由于byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,他们不能作用于switch语句中。在Java 7 以后,switch语句可以用作String类型上。
2.short s1 = 1;s1 = s1 + 1;有什么错?short s1 = 1;short s1 = 1;s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1;由于s1+1在运算时会自动提升表达式的类型(即隐式强制转换),所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。对于short s1 = 1;s1 += 1;由于+=是java语言规定的运算符,java编译器对进行特殊处理,因此可以正确编译。
3.Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与他们的英文名称的含义相对应。ceil的英文释义是天花板,该方法的作用就是向上取整,Math.ceil(11.5)的结果就为12,Math.ceil(-11.5)的结果就为-11。floor的英文释义是地板,该方法的作用就是向下取整Math.floor(11.5)的结果就为11,Math.floor(-11.5)的结果就为-12。round表示四舍五入,算法为Math.floor(x+0.5),即将原来的数字加上0.5以后再向下取整,所以Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11
4.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会执行,什么时候被执行,return前还是后?
finally 语句总会执行,除非遇到一些特殊情况,如System.exit(0),结束当前正在运行中的java虚拟机。
在方法返回前被执行,在return执行中间,return语句并不一定就是结束一段程序,当它和finally一起使用时
1、当finally语句中无return时会先等finally语句执行完成后再返回值。
2、当finally语句中有return语句时会直接返回finally中return的语句。
以上两种情况可以用下面两段代码分析
1、这是第一种情况,当finally语句中无return时
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());
}
static int test(){
int x = 1;
try{
return x;
}finally {
System.out.println("finally语句被执行");
x++;
}
}
}
//此时运行结果为:
finally语句被执行
1
2、这是第二种情况,当finally语句中存在return时
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());
}
static int test(){
int x = 1;
try{
return x;
}finally {
System.out.println("finally语句被执行");
x++;
return x;
}
}
}
//此时的运行结果为:
finally语句被执行
2
注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回给调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值。如果在finally中修改了返回值,就会返回修改后的值。
主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。此时finally中如果出现return语句就会覆盖掉之前的结果,类似于狸猫换太子。
5.ArrayList与Vector的异同?
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数据,我们以后可以按照位置索引来引导取出某个元素,并且其中的数据是允许重复的。
区别:
1.同步性
Vector是线程安全的,它的方法之间是线程同步的,二ArrayList是线程不安全的,它的方式之间是线程不同步。如果只有一个线程会访问到集合,那么优先考虑ArrayList,因为它相对于Vector效率会高些。
2.数据增长
ArrayList与Vector都有一个初始的容量大小,当存储进他们里面的元素的个数超过了容量时,就需要增加存储空间,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来的两倍,而ArrayLits的增长率在文档中并没有明确的规定(从源代码看到的是增长为原来的1.5倍)。ArrayList和Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
以上内容是学习总结收集后的结果。
本人只是java学习中的小学生,有更好的想法请说明并解释,不然我怕我看不懂[捂脸]。