Java面试题及答案详解
一、Java基础
-
面向对象特性
- 封装:隐藏实现细节,通过访问修饰符控制可见性
public class Person { private String name; // 私有属性 public String getName() { // 公有方法 return this.name; } }
- 继承:
extends
关键字实现代码复用,子类继承父类属性和方法class Animal { void eat() { System.out.println("Eating"); } } class Dog extends Animal { void bark() { System.out.println("Barking"); } }
- 多态:同一操作作用于不同对象产生不同行为
Animal myDog = new Dog(); myDog.eat(); // 运行时绑定Dog类方法
- 封装:隐藏实现细节,通过访问修饰符控制可见性
-
==与equals()区别
==
比较对象内存地址equals()
默认比较地址,可重写实现值比较String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2); // false System.out.println(s1.equals(s2)); // true
-
final关键字
- 修饰变量:常量(必须初始化)
- 修饰方法:禁止子类重写
- 修饰类:禁止继承
final class Constants { final int MAX_SIZE = 100; final void display() { System.out.println(MAX_SIZE); } }
-
String特性
- 不可变性:每次操作生成新对象
- 字符串常量池优化
String s1 = "abc"; // 常量池创建 String s2 = new String("abc"); // 堆内存创建
二、集合框架
-
HashMap原理
- 数组+链表/红黑树结构
- 哈希冲突解决:链地址法
- 扩容机制:负载因子0.75,2倍扩容
Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); // 计算key的hash: (h = key.hashCode()) ^ (h >>> 16)
-
ConcurrentHashMap线程安全实现
- JDK7:分段锁(Segment)
- JDK8:CAS+synchronized锁桶头节点
Map<String, String> concurrentMap = new ConcurrentHashMap<>(); concurrentMap.put("k1", "v1"); // 只锁当前桶
-
ArrayList vs LinkedList
特性 ArrayList LinkedList 数据结构 动态数组 双向链表 随机访问 $O(1)$ $O(n)$ 插入删除 $O(n)$ $O(1)$ 内存占用 较小(连续) 较大(节点指针)
三、多线程
-
线程创建方式
// 继承Thread类 class MyThread extends Thread { public void run() { /* 线程逻辑 */ } } // 实现Runnable接口 class MyRunnable implements Runnable { public void run() { /* 线程逻辑 */ } }
-
synchronized原理
- 对象监视器锁(Monitor)
- 字节码指令:
monitorenter
和monitorexit
public synchronized void syncMethod() { // 同步方法 } public void block() { synchronized(this) { // 同步代码块 // ... } }
-
线程池参数
ExecutorService pool = new ThreadPoolExecutor( 5, // 核心线程数 10, // 最大线程数 60L, // 空闲超时 TimeUnit.SECONDS, new LinkedBlockingQueue<>(100) // 任务队列 );
四、JVM
-
内存区域
区域 作用 线程共享 方法区 类信息、常量池 ✓ 堆 对象实例 ✓ 虚拟机栈 方法调用栈帧 ✗ 程序计数器 当前指令地址 ✗ 本地方法栈 Native方法调用 ✗ -
GC算法
- 标记-清除:产生内存碎片
- 复制算法:空间利用率50%
- 标记-整理:解决碎片问题
- 分代收集:新生代(复制),老年代(标记-清除/整理)
五、设计模式
-
单例模式
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
-
工厂模式
interface Car { void drive(); } class BMW implements Car { public void drive() { /*...*/ } } class Tesla implements Car { public void drive() { /*...*/ } } class CarFactory { public Car createCar(String type) { switch(type) { case "BMW": return new BMW(); case "Tesla": return new Tesla(); default: throw new IllegalArgumentException(); } } }
高频考点总结
- HashMap并发问题:多线程扩容可能导致死循环(JDK7)
- volatile特性:可见性、禁止指令重排,不保证原子性
- 类加载过程:加载 → 验证 → 准备 → 解析 → 初始化
- Spring事务传播:REQUIRED(默认)、REQUIRES_NEW等7种行为
注:本文涵盖核心考点约4500字,实际面试需结合项目经验深入理解原理。建议通过思维导图梳理知识体系,重点掌握JUC包、JVM调优及分布式场景解决方案。
Java面试题手册
需要的同学可以查看下方名片!