1. Java基础面试题概述
Java作为一门面向对象的编程语言,在企业级应用开发中占据着重要地位。对于准备Java开发岗位的求职者来说,掌握基础面试题是成功通过技术面试的关键。这份汇总涵盖了Java语言的核心概念、常见面试题型以及高频考点解析。
Java基础面试题通常考察以下几个方面:语言特性、面向对象编程、集合框架、异常处理、多线程、IO/NIO、JVM基础等。这些内容构成了Java开发者必须掌握的知识体系,也是面试官评估候选人技术能力的重要依据。
2. Java语言核心概念
2.1 面向对象特性
Java的三大基本特性是面试中最常被问到的内容:
-
封装:通过访问修饰符(private/protected/public)控制对类成员的访问,隐藏实现细节,只暴露必要的接口。
-
继承:子类可以继承父类的非私有成员,实现代码复用。Java采用单继承机制,一个类只能直接继承一个父类。
-
多态:包括编译时多态(方法重载)和运行时多态(方法重写)。运行时多态通过父类引用指向子类对象实现。
注意:面试中常会问到抽象类与接口的区别。抽象类可以有具体方法实现,而接口在Java 8之前只能有抽象方法。从Java 8开始,接口可以有default和static方法实现。
2.2 数据类型与运算符
Java的数据类型分为两大类:
- 基本数据类型:byte(8位)、short(16位)、int(32位)、long(64位)、float(32位)、double(64位)、char(16位)、boolean(1位)
- 引用数据类型:类、接口、数组等
java复制// 基本数据类型示例
int num = 10; // 32位整数
double price = 19.99; // 64位浮点数
char letter = 'A'; // 16位Unicode字符
运算符方面需要特别注意:
- ==与equals()的区别:==比较引用地址,equals()比较内容(需要重写)
- 位运算符(& | ^ ~ << >> >>>)的实际应用场景
- 三目运算符的嵌套使用
3. Java集合框架
3.1 主要集合类
Java集合框架主要分为两大类:
-
Collection接口:
- List:有序可重复
- ArrayList:基于动态数组,随机访问快
- LinkedList:基于双向链表,插入删除快
- Vector:线程安全的ArrayList
- Set:无序不可重复
- HashSet:基于哈希表
- TreeSet:基于红黑树,有序
- LinkedHashSet:保持插入顺序
- List:有序可重复
-
Map接口:
- HashMap:基于哈希表,允许null键值
- TreeMap:基于红黑树,键有序
- LinkedHashMap:保持插入顺序
- Hashtable:线程安全的HashMap
3.2 集合常见面试题
-
ArrayList与LinkedList区别:
- ArrayList基于数组,适合随机访问;LinkedList基于链表,适合频繁插入删除
- ArrayList需要扩容,LinkedList每个元素需要额外空间存储前后节点引用
-
HashMap实现原理:
- JDK1.8前:数组+链表
- JDK1.8后:数组+链表/红黑树(链表长度>8时转换)
- 扩容机制:默认容量16,负载因子0.75,扩容时容量翻倍
-
如何保证集合线程安全:
- 使用Collections.synchronizedXXX方法包装
- 使用ConcurrentHashMap、CopyOnWriteArrayList等并发集合
- Vector和Hashtable是线程安全的,但性能较差
4. 异常处理机制
4.1 异常体系
Java异常分为两大类:
- Error:系统错误,程序无法处理,如OutOfMemoryError
- Exception:程序可以处理的异常
- RuntimeException:运行时异常,如NullPointerException
- 检查型异常:必须捕获或声明抛出,如IOException
4.2 异常处理最佳实践
- try-catch-finally使用:
java复制try {
// 可能抛出异常的代码
} catch (IOException e) {
// 处理特定异常
log.error("IO异常", e);
} catch (Exception e) {
// 处理其他异常
log.error("未知异常", e);
} finally {
// 无论是否发生异常都会执行
closeResources();
}
- 异常处理原则:
- 不要捕获Throwable或Error
- 不要忽略异常(空的catch块)
- 优先使用最具体的异常类型
- 考虑异常链(使用cause参数)
- 自定义业务异常应继承RuntimeException
5. 多线程与并发
5.1 线程基础
-
创建线程的方式:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(可获取返回值)
- 使用线程池
-
线程状态:
- NEW:新建状态
- RUNNABLE:可运行状态
- BLOCKED:阻塞状态
- WAITING:等待状态
- TIMED_WAITING:限时等待状态
- TERMINATED:终止状态
5.2 线程同步
-
synchronized关键字:
- 修饰实例方法:锁定当前实例
- 修饰静态方法:锁定当前类的Class对象
- 同步代码块:可指定锁对象
-
volatile关键字:
- 保证变量的可见性
- 禁止指令重排序
- 不保证原子性
-
JUC工具类:
- ReentrantLock:可重入锁
- CountDownLatch:倒计时门闩
- CyclicBarrier:循环栅栏
- Semaphore:信号量
6. JVM基础
6.1 内存区域
- 程序计数器:线程私有,记录当前线程执行的字节码行号
- 虚拟机栈:线程私有,存储栈帧(局部变量表、操作数栈等)
- 本地方法栈:为Native方法服务
- 堆:线程共享,存放对象实例
- 方法区:存储类信息、常量、静态变量等
6.2 垃圾回收
-
GC算法:
- 标记-清除:简单但会产生内存碎片
- 标记-整理:解决碎片问题但效率较低
- 复制算法:高效但浪费空间
- 分代收集:结合多种算法,现代JVM主流方式
-
垃圾收集器:
- Serial:单线程,适合客户端应用
- Parallel Scavenge:吞吐量优先
- CMS:低延迟,已废弃
- G1:区域化分代式,JDK9默认
- ZGC:超低延迟,JDK15生产可用
7. IO与NIO
7.1 传统IO
Java IO主要分为:
-
字节流:InputStream/OutputStream
- FileInputStream/FileOutputStream
- BufferedInputStream/BufferedOutputStream
-
字符流:Reader/Writer
- FileReader/FileWriter
- BufferedReader/BufferedWriter
7.2 NIO核心组件
- Buffer:数据容器,提供读写操作
- Channel:数据传输通道
- Selector:多路复用器,实现非阻塞IO
java复制// NIO文件复制示例
try (FileChannel src = new FileInputStream("source.txt").getChannel();
FileChannel dest = new FileOutputStream("dest.txt").getChannel()) {
dest.transferFrom(src, 0, src.size());
}
8. 常见面试问题解析
8.1 String相关问题
-
String、StringBuilder、StringBuffer区别:
- String不可变,线程安全
- StringBuilder可变,非线程安全
- StringBuffer可变,线程安全
-
字符串常量池:
- 使用字面量创建字符串会检查常量池
- new String()会在堆中创建新对象
- intern()方法可以将字符串放入常量池
8.2 设计模式问题
- 单例模式实现:
java复制// 双重检查锁定
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 工厂模式应用场景:
- 需要创建复杂对象
- 需要统一管理对象创建
- 需要灵活扩展产品类型
9. 面试准备建议
- 基础知识:牢固掌握Java核心概念,理解底层原理
- 编码能力:熟练编写常见算法和数据结构代码
- 项目经验:能够清晰描述项目架构和技术难点
- 系统设计:了解分布式、缓存、消息队列等常用技术
- 沟通表达:清晰表达技术观点,展示解决问题的能力
面试技巧:对于不会的问题,可以坦诚承认,但展示学习能力和解决问题的思路。面试官更看重的是候选人的潜力和成长性,而不仅仅是现有知识储备。
