面试官常问的Java 基础题(一)
面试官常问的 Java 基础题 1-10
- 1. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
- 2. & 和 && 的区别。
- 3. Java 有没有 goto?
- 4. 在 JAVA 中,如何跳出当前的多重嵌套循环?
- 5. switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
- 6. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- 7. char 型变量中能不能存贮一个中文汉字?为什么?
- 8. 编程题: 用最有效率的方法算出 2 乘以 8 等于几?
- 9. 使用 final 关键字修饰一个变量时,是引用变量不能变,还是引用的对象不能变?
- 10."==" 和 equals 方法有什么区别?
1. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
一个".java"源文件中能有多个类,但只能有一个 public 类,并且 public 的类名必须与文件名相同。
2. & 和 && 的区别。
& 与 && 都可作为逻辑与;
& 可做运算符,当 & 操作符两边的表达式不是 boolean 类型时,& 表示按位与操作;
&& 有短路的功能,如果第一个表达式为 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)不会增长
& 还可以用作位运算符,当 & 操作符两边的表达式不是 boolean 类型时,& 表示按位与操作,
我们通常使用 0x0f 来与一个整数进行 & 运算,来获取该整数的最低 4 个 bit 位,
例如,0x31&0x0f 的结果为 0x01。备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。
3. Java 有没有 goto?
goto 是 java 中的保留字,现在没有在 java 中使用。
补充:
(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)
4. 在 JAVA 中,如何跳出当前的多重嵌套循环?
在外面定义 boolean f = false;
f = true;(跳出外循环)
break;(跳出内循环)
在 Java 中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的 break 语句, 即可跳出外层循环。
如下:
我个人通常并不使用标号这种方式,应该避免使用带标签的 break 和 continue !!!
我们可以让外层的循环条件表达式的结果受到里层循环体代码的控制。
如下:要在二维数组中查找到某个数字。
5. switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
switch 能作用在 byte 上;
switch 不能作用在 long 上;
switch 在JDK1.7之后能作用在 String 上。
补充:
在 switch(expr1)中,expr1 只能是一个整数表达式或者枚举常量(更大字体) ,整数表达式可以是 int 基本类型或 Integer 包装类型,由于,byte、short、char 都可以隐含转换为 int,所以,这些类型以及这些类型的包装类型也是可以的。
显然,long 和 String 类型都 不符合 switch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们不能作用于 swtich 语句中,但是 JDK1.7 之后,switch 也支持了 String(注意)。
在Java 5以前,switch(expr)中,expr只能是byte、short、char、int;
从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型;
从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
6. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; 需要强制转换类型的错误【s1 = (short) (s1 + 1);】
short s1 = 1; s1 += 1;没错
对于 shorts1=1;s1=s1+1; 由于 s1+1 运算时会自动提升表达式的类型,所以结果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误。
对于 shorts1=1;s1+=1;由于 += 是 java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以正确编译。
7. char 型变量中能不能存贮一个中文汉字?为什么?
char 型变量中能存贮一个中文汉字。
char 型变量是用来存储 Unicode 编码的字符,unicode 编码字符集中包含了汉字,所以char 型变量中可以存储汉字。
不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。
补充说明:unicode 编码占用两个字节,所以,char 类型的变量也是占用两个字节。
备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些
相关的知识,做到知无不言,言无不尽。
8. 编程题: 用最有效率的方法算出 2 乘以 8 等于几?
2<<3
因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,而位运算 cpu 直接支持的, 效率最高,所以,2 乘以 8 等於几的最效率的方法是 2<<3。
9. 使用 final 关键字修饰一个变量时,是引用变量不能变,还是引用的对象不能变?
使用 final 关键字修饰一个变量时,指引用变量不能变,引用变量所指向的对象中的内容可以改变。
如下:
对于如下语句:
执行如下语句将报告编译期错误:
但是,执行如下语句则可以通过编译:
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
10."==" 和 equals 方法有什么区别?
== 和 equals 都能比较变量的值是否相等;
== 比较对象的地址,equals 比较对象的内容。
-
== 比较两个变量的值是否相等 ,也就是用于比较变量所对应的内存中所存储的数值是否相同,比较两个基本类型的数据或两个引用变量是否相等。
== 比较两个对象的地址是否相等 ,如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存) ,变量也占用一块内存, 例如 : Objet obj=new Object(); 变量 obj 是一个内存,new Object() 是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。
对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。 -
equals 比较两个对象的内容是否相同 ,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
例如, 对于下面的代码:String a = newString("foo"); String b = newString("foo");
两条 new 语句创建了两个对象,然后用 a、b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的, 即 a 和 b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回 true。
在实际开发中,我们经常要比较传递进来的字符串内容是否等,例如,Stringinput=…;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。
记住, 字符串的比较基本上都是使用 equals 方法。 如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法 ,Object 类的 equals 方法的实现代码如下:
这说明, 如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就是使用==操作符 ,也是在比较两个变量指向的对象是否是同一对象,这时候使用 equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。
如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals 方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)
上一篇: 加速Java应用开发速度3——单元/集成测试+CI
下一篇: 面向对象四大基本特征