Java基础语法以及面试技巧(三)

Java 流程控制核心指南(面试重点)

上期面试题解答

上文链接:https://blog.csdn.net/weixin_73492487/article/details/146129058

1.i++++i的实现原理区别?
2.短路运算符的实际应用场景?
3.如何不用临时变量交换两个整数?

1.i++ 与 ++i 的实现原理区别?
答:字节码层面,i++ 先加载值再自增,++i 先自增再加载值
2.短路运算符的实际应用场景?
答:空指针检查(if (obj != null && obj.valid))
3.如何不用临时变量交换两个整数?

a = a ^ b;
b = a ^ b; // b → 原a
a = a ^ b; // a → 原b

1. Scanner 输入处理

Scanner sc = new Scanner(System.in); //创建一个 Scanner 对象,它用于从标准输入流(键盘)读取数据
System.out.print("输入整数:");
int num = sc.nextInt();       // 读取整型
System.out.print("输入字符串:");
String str = sc.nextLine();   // 读取整行
sc.close();                   // 重要!关闭Scanner,防止占用资源

关键要点

  • next()nextLine() 区别:
    • next() 读取到空格/换行符停止
    • nextLine() 读取整行(含空格)
  • 资源泄漏问题:推荐使用 try-with-resources
    try (Scanner sc = new Scanner(System.in)) {
        // 自动关闭
    }
    
    • try-with-resources 是一种自动关闭资源的机制。它允许在 try 语句块内声明并初始化一个或多个资源(如 Scanner),并确保在 try 块执行完毕后自动关闭这些资源,无论是否抛出异常。

面试题:以下代码会出现什么问题?

Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
String s = sc.nextLine(); // 会读取到空字符串!

2. 选择结构

2.1 if-else

if (条件1) {
    // 代码块1
} else if (条件2) {
    // 代码块2
} else {
    // 默认代码块
}

优化技巧

  • 优先处理简单条件
  • 合并重复条件判断
  • 避免深层嵌套(超过3层考虑重构)

2.2 switch 结构

switch (表达式) {    // 支持:byte/short/int/char/String(JDK7+)/enum
    case1: 
        // 代码
        break;     // 防止case穿透
    case2,3:  // JDK12+ 多case合并
        // 代码
        yield 结果; // JDK14+ switch表达式
    default:
        // 默认代码
}

重要特性

  • case穿透:缺少break时继续执行后续case
  • 类型限制:不可用long/float/double等类型
  • 新特性(JDK14+):
    String result = switch (day) {
        case 1 -> "Monday";
        default -> "Unknown";
    };
    

面试题

  1. 以下代码输出什么?
    int x = 2;
    switch (x) {
        case 1: System.out.print("A");
        case 2: System.out.print("B");
        case 3: System.out.print("C");
        default: System.out.print("D");
    } // 输出:BCD
    

3. 循环结构

3.1 基础循环

类型 语法 特点
while while(条件) { ... } 先判断后执行
do-while do { ... } while(条件); 至少执行一次
for for(初始化;条件;迭代) 明确循环次数时使用

重要区别

int i=0;
while(i < 0) {  // 不执行
    System.out.print("A");
}

do {            // 执行一次
    System.out.print("B");
} while(i < 0);

3.2 增强for循环

for(元素类型 变量 : 数组/集合) {
    // 代码
}

底层原理

  • 数组:通过索引遍历
  • Iterable对象:使用迭代器(iterator)

限制

  • 不能直接修改集合结构(会抛ConcurrentModificationException)
  • 无法获取当前索引位置

4. 流程控制语句

4.1 break/continue

语句 作用 特殊形式
break 跳出当前循环/switch 带标签跳转(见下文)
continue 跳过本次循环剩余代码 可配合标签使用

4.2 标签跳转

outer: for(int i=0; i<3; i++) {
    inner: for(int j=0; j<5; j++) {
        if(j == 2) break outer; // 直接跳出外层循环
        // if(j == 2) continue outer; // 直接跳到外层循环=break
    }
}

注意:Java没有真正的goto语句,标签只能用于循环/代码块


⚡ 高频面试题

  1. switch能否用字符串作为case值?

  2. 如何避免switch的case穿透?

  3. 增强for循环删除元素会怎样?如何解决?

你可能感兴趣的:(java,开发语言)