21xrx.com
2025-06-20 21:36:49 Friday
文章检索 我的文章 写文章
Java面试中的经典场景题及解析
2023-06-12 05:02:14 深夜i     93     0
Java面试 场景题 线程同步 集合操作 异常处理

在Java面试时,场景题是常见的面试题型之一。这些问题旨在考察面试者的实际操作能力和解决问题的能力。以下是一些经典的Java面试场景题及其解析。

1. 线程同步问题

在多线程编程中,线程同步是一个非常重要的概念。当多个线程同时对共享资源进行访问时,容易出现数据不一致的情况。在Java中,通过synchronized关键字和Lock接口可以实现线程同步功能。下面是一个示例代码:

class Employee {
  private int salary = 1000;
  public synchronized void increaseSalary() {
    salary = salary + 100;
  }
  public synchronized void decreaseSalary()
    salary = salary - 100;
  
  public int getSalary()
    return salary;
  
}
class SalaryTask implements Runnable {
  private Employee employee;
  public SalaryTask(Employee employee)
    this.employee = employee;
  
  public void run() {
    employee.increaseSalary();
    employee.decreaseSalary();
  }
}
public class ThreadSyncDemo {
  public static void main(String[] args) {
    Employee employee = new Employee();
    for (int i = 0; i < 100; i++) {
      Thread t = new Thread(new SalaryTask(employee));
      t.start();
    }
    System.out.println("Final salary: " + employee.getSalary());
  }
}

在这个示例中,Employee类表示一个员工对象,其中包含一个salary字段和三个方法:increaseSalary()、decreaseSalary()和getSalary()。SalaryTask类表示一个修改Employee对象salary字段的任务。在主程序中,创建100个线程执行SalaryTask任务,并打印最终的salary值。

2. 集合操作问题

在Java中,集合框架是非常常用的组件。在面试中,经常会让面试者编写一些集合操作相关的代码。下面是一个示例代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
  private String name;
  private int age;
  public Person(String name, int age)
    this.name = name;
    this.age = age;
  
  public String getName()
    return name;
  
  public int getAge()
    return age;
  
}
public class CollectionDemo {
  public static void main(String[] args) {
    List
  list = new ArrayList 
  
   ();
  
 
    list.add(new Person("John", 25));
    list.add(new Person("Alice", 23));
    list.add(new Person("Bob", 30));
    Collections.sort(list, new Comparator
  () {
 
      public int compare(Person p1, Person p2) {
        if (p1.getAge() == p2.getAge())
          return 0;
         else if (p1.getAge() > p2.getAge())
          return 1;
         else
          return -1;
        
      }
    });
    for (Person p : list) {
      System.out.println(p.getName() + " " + p.getAge());
    }
  }
}

在这个示例中,Person类表示一个人对象,其中包含name和age两个字段。CollectionDemo类创建一个Person列表,并通过Collections.sort()方法按照age字段对列表进行排序。排序方法通过实现Comparator接口的compare()方法来指定排序规则。最后,通过循环遍历列表并打印结果。

3. 异常处理问题

在Java编程中,异常处理是一个非常重要的概念。在面试中,通常会给出一个带有异常处理的代码段,并要求面试者对这段代码进行分析。下面是一个示例代码:

public class ExceptionDemo {
  public static void main(String[] args) {
    try {
      int num = Integer.parseInt("XYZ");
    } catch (NumberFormatException e) {
      System.out.println("Invalid number format");
    } finally {
      System.out.println("End of program");
    }
  }
}

在这个示例中,NumberFormatException是当给定的String类型不是有效数字而抛出的异常类型。在try块中,我们尝试将"XYZ"转化为整数。如果发生异常,则将在catch块中捕获,并打印"Invalid number format"消息。无论是否发生异常,finally块中的代码都将执行。最终,程序将打印"End of program"消息。

  
  

评论区