Java 面试常见问题解析
Java 是一门被广泛应用于企业开发中的编程语言,了解其基本概念和常见技术点是 Java 面试中常见的题目。在本文中,我们将探讨一些 Java 面试中的常见问题,并提供简要的解答。编辑
1. 举例9个运行时异常
在 Java 中,运行时异常是 RuntimeException
类及其子类抛出的异常,它们不要求在编译时进行捕获或声明抛出。编辑
常见的运行时异常包括:
-
NullPointerException
:访问或操作一个为null
的对象或数组。
java String str = null; System.out.println(str.length()); // 会抛出 NullPointerException
-
ArrayIndexOutOfBoundsException
:访问数组时使用了非法的索引。
java int[] arr = new int[3]; System.out.println(arr[5]); // 会抛出 ArrayIndexOutOfBoundsException
-
ArithmeticException
:发生算术运算错误,比如除以零。
java int result = 10 / 0; // 会抛出 ArithmeticException
-
ClassCastException
:尝试将对象强制转换为不兼容的类型。编辑
java Object obj = new Integer(100); String str = (String) obj; // 会抛出 ClassCastException
-
NumberFormatException
:尝试将字符串转换为数字时格式不正确。
java String str = "abc"; int num = Integer.parseInt(str); // 会抛出 NumberFormatException
-
IndexOutOfBoundsException
:访问集合时使用了非法的索引。
java List<Integer> list = new ArrayList<>(); list.add(1); System.out.println(list.get(1)); // 会抛出 IndexOutOfBoundsException
-
IllegalArgumentException
:方法接收到不合法或不合适的参数时抛出。
java public void setAge(int age) { if (age < 0) { throw new IllegalArgumentException("Age cannot be negative"); } }
-
UnsupportedOperationException
:调用不支持的操作时抛出。
java List<Integer> list = Collections.unmodifiableList(new ArrayList<>()); list.add(1); // 会抛出 UnsupportedOperationException
-
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
是一个典型的单例模式,它在整个应用程序的生命周期中仅创建一次,并供各个组件共享。
- 例如,Spring 中的
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. 抽象类和接口的区别
- 抽象类 :
- 可以有构造方法、实例变量和方法(有或没有实现)。
- 用
abstract
关键字定义。 - 不能实例化,但可以有一些已实现的方法。
java public abstract class Animal { abstract void sound(); }
- 接口 :
- 只能包含抽象方法(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 中的一种强大机制,可以在运行时动态获取类的信息以及操作类的属性和方法。
-
获取类的信息 :
java Class<?> clazz = Class.forName("java.lang.String"); System.out.println(clazz.getName());
-
动态调用方法 :
java Method method = clazz.getMethod("substring", int.class); String result = (String) method.invoke("Hello, World!", 7); System.out.println(result); // 输出 "World!"
反射允许程序在运行时对类进行动态分析和修改,因此可以实现很多灵活的功能,但也可能影响性能,因此使用时需要谨慎。编辑
通过掌握这些 Java 面试中的核心概念和常见问题,可以更好地准备面试,深入理解 Java 编程语言的各种机制。