初级面试题
1. Java 基础
1.1. 什么是面向对象编程?Java 是如何支持它的?
面向对象编程(OOP)是一种通过对象来组织代码的编程范式,主要特征有:封装、继承、多态和抽象。
Java 通过类和对象支持 OOP 概念。类是对象的模板,定义了属性和行为。继承允许类扩展其他类,多态使得子类对象可以替换父类对象使用。
1.2. 什么是构造函数?与普通方法有什么区别?
构造函数是用于创建对象并初始化对象状态的特殊方法。
- 与普通方法不同,构造函数没有返回类型。
- 构造函数的名称必须与类名相同。
- 每次创建类的实例时,构造函数都会被调用。
1.3. Java 中的 final
关键字的作用是什么?
final
变量:值一旦初始化后无法更改。final
方法:子类无法重写该方法。final
类:该类无法被继承。
1.4. 描述 ArrayList
和 LinkedList
的区别。
ArrayList
:基于数组实现,支持快速随机访问,插入和删除元素(尤其在中间位置)比较慢,因为涉及数组的移动操作。LinkedList
:基于链表实现,插入和删除元素较快,但随机访问元素的速度较慢,因为需要遍历链表。
1.5. 什么是线程?如何在 Java 中创建线程?
线程是操作系统中的最小执行单元,一个 Java 程序默认运行在主线程上。创建线程的方式:
- 继承
Thread
类,并重写run()
方法。 - 实现
Runnable
接口,并将其实例传递给Thread
对象。 - 使用
Callable
接口与FutureTask
类。
示例:
public class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
MyThread thread = new MyThread();
thread.start(); // 启动线程
1.6. ==
和 equals()
有什么区别?
==
:用于比较基本数据类型的值,或比较引用类型时,比较的是引用地址。equals()
:通常用于比较对象的内容,可以在类中重写该方法。
1.7. 解释 Java 中的异常处理机制。
Java 通过 try-catch-finally
结构处理异常。
try
:定义可能抛出异常的代码块。catch
:捕获并处理特定类型的异常。finally
:始终执行的代码块(通常用于资源释放)。
示例:
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Cannot divide by zero");
} finally {
System.out.println("End of try-catch block");
}
2. 集合框架
2.1. 什么是 Java 集合框架?
Java 集合框架是数据结构和算法的集合。它包括接口(如 List
, Set
, Map
)以及实现类(如 ArrayList
, HashSet
, HashMap
),帮助管理和操作数据。
2.2. 解释 HashMap
的工作原理。
HashMap
基于哈希表实现,通过哈希函数将键映射到数组的索引位置。
当发生哈希冲突时,HashMap
会使用链表或红黑树(在 Java 8 及以后)存储多个键值对。
2.3. HashSet
和 TreeSet
有什么区别?
HashSet
:基于哈希表实现,元素没有顺序。TreeSet
:基于红黑树实现,元素按自然顺序排序。
2.4. 你如何在 HashMap
中处理键的冲突?
HashMap
使用链地址法(链表或红黑树)处理哈希冲突。每个数组桶(bucket)存储具有相同哈希值的键值对,在冲突时,将新键值对追加到链表或树中。
3. 面向对象设计
3.1. 解释继承和多态性。
- 继承:允许子类继承父类的属性和方法,避免重复代码。
- 多态性:同一个方法可以在不同对象上表现出不同的行为。分为编译时多态(方法重载)和运行时多态(方法重写)。
3.2. 你如何实现 Java 接口?它和抽象类有什么区别?
实现接口需要使用 implements
关键字,并实现接口中的所有方法。
- 接口:不能包含任何非
static
方法的实现,Java 8 以后支持default
方法。 - 抽象类:可以包含部分已实现的方法和成员变量,提供更具体的设计。
3.3. 解释封装和信息隐藏的概念。
封装是将数据和操作封装在类内部,使用访问修饰符(如 private
、public
、protected
)控制访问权限,从而隐藏类的实现细节,只暴露必要的接口。
想要提升更多,请点击进入>>小奈AI