2017 Java面试大全(一)
1. 一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以包括多个类,但是只有一个public的类,并且,这个public的类名必须和文件名相同。
2.Java有没有goto?
Java的保留字,现在还没有在Java中使用。
3.&与&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and)。当且仅当运算符两侧表达式都为true时,运算结果为true;若两侧有任一表达式为false,运算结果都为false。
&&运算符具有短路功能,即当第一个表达式的值为false时,将不再对第二个表达式进行判断。比如:if(str != null && str.equals("")),当str 为 null 时,前面表达式为false,将不会再执行后边的表达式,也就不会抛出空指针异常;但是对于if(str != null & str.equals(""))表达式,则会对两个表达式都进行判断而抛出空指针异常;
&还可以用作按位与的运算符,表示按位与。当运算符两侧的表达式的值不是bool类型时,&表示按位与操作。我们通常会使用0x0f来按位与一个整数,从而获得该整数的最低4个bit位。例如:0x31&0x0f的结果为0x01。
4.在Java中如何跳出当前的多重嵌套循环?
在Java中,跳出多重嵌套循环,一般有两种方法;一种是通过在外层循环定义一个标号,然后在内层用使用了该标号的break语句,即可跳出循环; 另一种方法则是定义一个flag标志来控制每一层循环的条件,通过内层控制该flag的值(true or false)来跳出循环。代码示例如下:
// 方法一:
1 ok:
2 for (int i = 0; i < 100; i++){
3 for (int j = 0; j < 100; j++){
4 for (int k = 0; k < 100; k++){
5 if (k == 5)
6 break ok;
7 }
8 }
9 }
// 方法二:
1 bool flag = true;
2 for (int i = 0; i < 100 && flag; i++){
3 for (int j = 0; j < 100 && flag; j++){
4 for (int k = 0; k < 100 && flag; k++){
5 if (k == 5)
6 flag = false;
7 }
8 }
9 }
5.switch语句能否作用在byte上?能否作用在long上?能否作用在String上?
在switch(value)中,value只能是整型表达式或枚举常量,其中,整型表达式可以是int基本类型或Internet包装类型。因为byte,short,char可以隐式转换为int,所以这些类型及其包装类型都可以作为switch的值;但是long,String不可以隐式转换为整型,不符合switch语句的语法规范,所以不能用于switch语句。
6.short s1 = 1; s1 = s1 + 1; 有什么错? shor s1 = 1; s1 += 1; 有什么错?
由于s1 + 1在计算时会自动提升表达式的类型,计算结果为int型,而int不能隐式转换为short,当把结果再赋给short类型的s1时,编译器将会报强制类型转换的错误; 而对于s1 += 1, += 是Java语言规定的运算符,Java编译器会对他进行特殊处理,将不会有任何错误,可以正常编译。
7.char型变量中能否存储一个中文汉字?为什么?
char型变量存储的是Unicode编码的字符,而汉字是Unicode编码的,所以char型变量中当然可以存储汉字。但是对于一些特殊的汉字可能没有被Unicode编码包含,那么这些字符不能存储在char型变量中。另外,Unicode编码占两个字节,所以,char型变量也占两个字符。
8.用最有效率的方法算出2乘以8等于几?
2<<3;
将一个数左移n位,就相当于这个数乘以了2的n次方;2乘以8就等于2乘以2的3次方,也就是2<<3;并且移位运算直接由cpu支持,所以效率最高。
9.请设计一个一百亿的计算器(本题非个人整理)
首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以byte 类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,如果两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为11111110,也就是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,如果两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的,这说明计算机中的算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范围。由于Java中涉及表达式运算时的类型自动提升,我们无法用byte类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);
先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:
(1)这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数
(2)有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中
(3)提供加减乘除的功能
1 public class BigInteger{
2
3 int sign;
4
5 byte[] val;
6
7 public Biginteger(String val) {
8
9 sign = ;
10
11 val = ;
12
13 }
14
15 public BigInteger add(BigInteger other) {
16
17
18
19 }
20
21 public BigInteger subtract(BigInteger other) {
22
23
24
25 }
26
27 public BigInteger multiply(BigInteger other){
28
29
30
31 }
32
33 public BigInteger divide(BigInteger other){
34
35
36
37 }
38
39
40
41 }
10.使用final关键字修饰一个变量时,是引用变量不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是引用变量不能变,而引用变量所指向的对象中的内容可以改变。举个例子来说:final StringBuffer a = new StringBuffer("aaa");
对于语句 a = new StringBuffer("");执行时编译器将会报告错误;但是对于语句 a.append("bbb");则可以编译通过。
今天的经验就到这里,请关注小李后续的文章,将会奉上更多的经验!
版权所有,允许转载,转载请注明出处,侵权必究!