面试真实经历某商银行大厂Java问题和答案总结(四)

138 阅读5分钟

Java 面试常见问题解析

Java 是一门被广泛应用于企业开发中的编程语言,了解其基本概念和常见技术点是 Java 面试中常见的题目。在本文中,我们将探讨一些 Java 面试中的常见问题,并提供简要的解答。​编辑


1. 举例9个运行时异常

在 Java 中,运行时异常是 RuntimeException 类及其子类抛出的异常,它们不要求在编译时进行捕获或声明抛出。​编辑

常见的运行时异常包括:

  1. NullPointerException:访问或操作一个为 null 的对象或数组。
    java    String str = null;    System.out.println(str.length());  // 会抛出 NullPointerException    

  2. ArrayIndexOutOfBoundsException:访问数组时使用了非法的索引。
    java    int[] arr = new int[3];    System.out.println(arr[5]);  // 会抛出 ArrayIndexOutOfBoundsException    

  3. ArithmeticException:发生算术运算错误,比如除以零。
    java    int result = 10 / 0;  // 会抛出 ArithmeticException    

  4. ClassCastException:尝试将对象强制转换为不兼容的类型。​编辑
    java    Object obj = new Integer(100);    String str = (String) obj;  // 会抛出 ClassCastException    

  5. NumberFormatException:尝试将字符串转换为数字时格式不正确。
    java    String str = "abc";    int num = Integer.parseInt(str);  // 会抛出 NumberFormatException    

  6. IndexOutOfBoundsException:访问集合时使用了非法的索引。
    java    List<Integer> list = new ArrayList<>();    list.add(1);    System.out.println(list.get(1));  // 会抛出 IndexOutOfBoundsException    

  7. IllegalArgumentException:方法接收到不合法或不合适的参数时抛出。
    java    public void setAge(int age) {        if (age < 0) {            throw new IllegalArgumentException("Age cannot be negative");        }    }    

  8. UnsupportedOperationException:调用不支持的操作时抛出。
    java    List<Integer> list = Collections.unmodifiableList(new ArrayList<>());    list.add(1);  // 会抛出 UnsupportedOperationException    

  9. ConcurrentModificationException:在遍历集合时,同时修改集合。
    java    List<Integer> list = new ArrayList<>();    list.add(1);    for (Integer num : list) {        list.add(2);  // 会抛出 ConcurrentModificationException    }    


2. Spring中的设计模式

Spring 框架在实现时使用了多个经典的设计模式,其中最重要的设计模式之一是 单例模式 (Singleton)

  • 单例模式 (Singleton):在 Spring 中,默认情况下,所有的 Bean 都是单例模式。也就是说,Spring 容器中每个 Bean 只有一个实例,在整个应用程序中共享。
    - 例如,Spring 中的 ApplicationContext 是一个典型的单例模式,它在整个应用程序的生命周期中仅创建一次,并供各个组件共享。

3. 重载和重写有什么区别

  • 重载 (Overloading):同一个类中,方法名相同,但参数列表不同。重载发生在编译时,编译器根据方法的参数个数、类型或顺序来区分。

    java   public class Demo {       public void display(int a) { System.out.println("Integer: " + a); }       public void display(String a) { System.out.println("String: " + a); }   }  
  • 重写 (Overriding):子类重新定义父类的某个方法,方法名、返回值类型、参数列表必须完全一致。重写发生在运行时, JVM 根据对象的实际类型调用相应的方法。

  java   public class Parent {       public void speak() { System.out.println("Parent speaking..."); }   }      public class Child extends Parent {       @Override       public void speak() { System.out.println("Child speaking..."); }   }  


4. SpringMVC

SpringMVC 是基于 Servlet 的 Web 框架,采用了 MVC(模型-视图-控制器)设计模式。其核心特点包括:

  • DispatcherServlet:接收请求并根据配置的映射规则调用相应的处理方法。
  • Controller:处理业务逻辑,并将数据传递给视图。
  • ModelAndView:包含了模型数据和视图信息,用于返回给客户端。

SpringMVC 提供了灵活的请求映射机制、数据绑定、表单处理等功能,是 Spring 生态中重要的一部分。


5. 抽象类和接口的区别

  1. 抽象类
    - 可以有构造方法、实例变量和方法(有或没有实现)。
    - 用 abstract 关键字定义。
    - 不能实例化,但可以有一些已实现的方法。

   java    public abstract class Animal {        abstract void sound();    }    

  1. 接口
    - 只能包含抽象方法(Java 8 之后也可以有默认方法和静态方法)。
    - 用 interface 关键字定义。
    - 类可以实现多个接口。

   java    public interface Animal {        void sound();    }    

主要区别

  • 抽象类可以有方法的实现和成员变量,而接口只能声明方法。
  • 抽象类支持继承(单继承),而接口支持实现多个接口。

6. Java 8 新特性

Java 8 引入了很多新特性,其中最重要的包括:

  • Lambda 表达式:允许将函数作为参数传递给方法,简化了代码。

    java   List<String> list = Arrays.asList("a", "b", "c");   list.forEach(s -> System.out.println(s));  

  • Stream API:可以高效地处理集合和数据流,提供了更简洁的操作。

    java   List<String> list = Arrays.asList("a", "b", "c");   list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);  


7. ==、equals 和 hashcode

  • ==:用于比较基本数据类型的值或对象的引用地址。
    java   int a = 5, b = 5;   System.out.println(a == b);  // true  

  • equals:用于比较对象的内容,通常需要在类中重写该方法。
    java   String s1 = new String("test");   String s2 = new String("test");   System.out.println(s1.equals(s2));  // true  

  • hashcode:用于返回对象的哈希码,通常与 equals 一起使用,保证在哈希容器(如 HashMap)中一致性。
    java   String s1 = new String("test");   System.out.println(s1.hashCode());  


8. Java 反射

反射是 Java 中的一种强大机制,可以在运行时动态获取类的信息以及操作类的属性和方法。

  1. 获取类的信息
    java    Class<?> clazz = Class.forName("java.lang.String");    System.out.println(clazz.getName());    

  2. 动态调用方法
    java    Method method = clazz.getMethod("substring", int.class);    String result = (String) method.invoke("Hello, World!", 7);    System.out.println(result);  // 输出 "World!"    

反射允许程序在运行时对类进行动态分析和修改,因此可以实现很多灵活的功能,但也可能影响性能,因此使用时需要谨慎。​编辑


通过掌握这些 Java 面试中的核心概念和常见问题,可以更好地准备面试,深入理解 Java 编程语言的各种机制。