Java面试指南

Java 面试指南

答题时,可以按下面三个步骤:

  1. 是什么?
  2. 有什么用?
  3. 要注意什么?

第一章 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 语句作用的数据类型

intString 和枚举类型。以及所有能够被编译器隐式转换为 int 类型的数据类型byteshortchar 以及它们对应的包装类 IntegerByteShortCharacter 等。

由于 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);
    }

}

image-20230404212022306


   转载规则


《Java面试指南》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Redis集群 Redis集群
Redis 集群Redis 集群的安装配置 解压缩tar -zxvf /opt/module/redis-6.2.7.tar.gz -C /opt/module 编译make -C /opt/module/redis-6.2.7 安装m
2023-04-05
下一篇 
Crossformer Crossformer
Crossformer(2023 ICLR)引言MTS 介绍MTS(multivariate time series)中每一个维度都代表一个时间序列,且维度与维度之间是相互关联的,利用其它维度的历史信息可以更好地预测当前维度的信息。例如预测
2023-04-04
  目录