Java 面试指南
答题时,可以按下面三个步骤:
- 是什么?
- 有什么用?
- 要注意什么?
第一章 Java 基础
比较 & 和 && 的区别
相同点:
- 都可以作为逻辑与的运算符
不同点:
- 作为逻辑与的运算符,
&不会短路,而&&会短路 &还可以作为位运算与的操作符
@Test
public void booleanOperationTest() {
int x = 0;
int y = 0;
int z = 0;
// & 可以作为逻辑与的运算符, 但是不会短路, 因此 y 的值会发生改变
if (x == 1 & ++y > 0) {
}
System.out.println("y = " + y);
// && 会短路, 因此 z 的值不会发生改变
if (x == 1 && ++z > 0) {
}
System.out.println("z = " + z);
}
@Test
public void bitOperationTest() {
int x = 0x7fffffff;
System.out.println(x & 0xff);
}
Java 中跳出多层嵌套循环的方法(类似 goto)
public static void main(String[] args) {
FLAG:
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
for (int k = 0; k < 100; k++) {
if (k == 1) {
System.out.println(i);
// 跳转到 FLAG 作用域结束的位置
break FLAG;
}
}
}
}
// FLAG 标号作用域结束的位置
System.out.println("Break FLAG");
}
switch 语句作用的数据类型
int 、String 和枚举类型。以及所有能够被编译器隐式转换为 int 类型的数据类型:byte、short、char 以及它们对应的包装类 Integer、Byte、Short、Character 等。
由于 long 和 boolean 类型数据无法被编译器隐式地转换为 int 类型,所以不可以用于 switch 语句中,强制类型转换相当于生成了一个新的 int 类型数据。无法被编译器隐式转换而造成错误的类似案例还有很多,例如下面代码中,两处去掉强制类型转换后都会被编译器报错
@Test
public static void switchTest(String[] args) {
long l = 1;
switch ((int) l) {
case 0:
System.out.println("0");
break;
case 1:
System.out.println("1");
break;
default:
System.out.println("xxx");
}
}
@Test
public void shortTest() {
short s = 1;
s = (short) (s + 1);
// += 会被 Java 编译器进行特殊处理
s += 1;
}
BigInteger的源码学习
final 关键字
final 修饰的变量的值不能发生改变,但是该值可能是一个地址,而地址中对应的数据是可以发生改变的。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
String name;
int age;
}
public class JavaBaseMainV4 {
public final Person person = new Person("root", 18);
public static void main(String[] args) {
JavaBaseMainV4 app = new JavaBaseMainV4();
// 一个新的地址值复制给final关键字修饰的person变量, 因此报错
// app.person = new Person("root", 18);
app.person.name = "admin";
app.person.age = 24;
System.out.println(app.person);
}
}
