作为从业十年的Java开发者,我整理了一批高频出现的Java基础面试题。这些题目看似简单,却常常成为区分候选人真实水平的试金石。今天我们就来深入剖析这些基础题背后的技术原理和考察要点,帮助你在面试中展现出扎实的基本功。
String类的不可变性是Java语言设计的精妙之处。在JDK源码中,String内部使用final修饰的char数组存储数据:
java复制public final class String {
private final char value[];
}
这种设计带来三个关键优势:
注意:使用StringBuilder进行字符串拼接时,初始容量建议设置为预估长度+16,避免频繁扩容。
这两个方法的正确实现是Java集合框架正常工作的基础。必须遵守以下约定:
典型实现模板:
java复制@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyClass obj = (MyClass) o;
return field1 == obj.field1 &&
Objects.equals(field2, obj.field2);
}
@Override
public int hashCode() {
return Objects.hash(field1, field2);
}
| 特性 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 随机访问 | O(1) | O(n) |
| 头插效率 | O(n) | O(1) |
| 内存占用 | 更小(无指针) | 更大(节点开销) |
实际选择建议:
HashMap在并发场景下可能出现的三大问题:
解决方案演进:
Java虚拟机规范定义的五大内存区域:
常见GC算法对比:
调优经验:
Java异常分类:
code复制Throwable
├── Error(系统级错误)
└── Exception
├── RuntimeException(未检查异常)
└── 其他Exception(已检查异常)
处理原则:
规范的自定义异常实现:
java复制public class BusinessException extends RuntimeException {
private final ErrorCode errorCode;
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
// 包含更多上下文信息
public BusinessException(ErrorCode errorCode, Throwable cause) {
super(errorCode.getMessage(), cause);
this.errorCode = errorCode;
}
}
Java线程的6种状态:
状态转换示意图:
code复制NEW --start()--> RUNNABLE
RUNNABLE --wait()--> WAITING
WAITING --notify()--> RUNNABLE
volatile的两大特性:
典型使用场景:
BIO(Blocking IO)特点:
适用场景:
NIO三大核心:
性能对比:
反射调用比直接调用慢100倍以上,优化方案:
性能测试数据:
| 调用方式 | 耗时(纳秒/次) |
|---|---|
| 直接调用 | 2 |
| 反射调用 | 250 |
| 反射+缓存 | 6 |
| MethodHandle | 3 |
JDK动态代理实现要点:
java复制public class DebugProxy implements InvocationHandler {
private final Object target;
public DebugProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method " + method.getName());
return result;
}
}
Lambda实现机制:
性能特点:
流操作性能陷阱:
正确示例:
java复制List<String> names = employees.stream()
.filter(e -> e.getAge() > 30)
.map(Employee::getName)
.collect(Collectors.toList());
线程安全的单例实现演进:
现代最佳实践:
java复制public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
Spring框架典型模式应用:
面试中常问的Spring设计问题:
关键参数配置示例:
code复制-Xms4g -Xmx4g // 堆大小固定避免扩容
-XX:NewRatio=2 // 新生代老年代比例
-XX:+UseG1GC // G1垃圾收集器
-XX:MaxGCPauseMillis=200 // 目标暂停时间
监控工具推荐:
常见优化手段:
性能测试表明:
技术问题回答框架:
示例:回答HashMap原理
编码面试注意事项:
常见算法题分类:
项目介绍STAR法则:
技术难点示例:
"在订单系统中,我们遇到了高并发下的超卖问题。我通过Redis分布式锁+库存预扣减的方案,将并发处理能力提升了10倍,错误率降至0.1%以下。"
展示技术深度的技巧:
示例回答:
"我们最初使用同步锁解决并发问题,但在压测时发现吞吐量不足。后来改用CAS+重试机制,虽然代码复杂度增加,但QPS从500提升到了3000。这个经历让我深刻理解了并发控制的权衡之道。"
分布式系统核心问题:
设计模式应用:
典型问题排查流程:
常用工具链:
Java开发者成长路线:
推荐学习资源:
参与开源的建议:
我的个人经验是,先选择自己常用的库开始贡献,比如Guava、Spring Boot等。通过阅读优秀代码,不仅能提升技术水平,还能建立行业影响力。