1. Java基础
Java基础是面试的核心,涉及语法、面向对象等。以下是精选题目:
-
问题1:解释Java中的封装、继承和多态,并给出代码示例。
答案: 封装是隐藏对象内部细节(通过private字段和getter/setter方法),继承是子类复用父类特性(使用extends),多态是同一接口不同实现(通过方法重写或接口)。// 示例代码 class Animal { private String name; // 封装 public Animal(String name) { this.name = name; } public void makeSound() { System.out.println("Animal sound"); } // 多态基础 } class Dog extends Animal { // 继承 public Dog(String name) { super(name); } @Override public void makeSound() { System.out.println("Bark"); } // 多态实现 } public class Main { public static void main(String[] args) { Animal myDog = new Dog("Buddy"); myDog.makeSound(); // 输出 "Bark" } }
-
问题2:什么是Java的自动装箱和拆箱?举例说明潜在问题。
答案: 自动装箱是基本类型自动转为包装类(如int到Integer),拆箱是反向转换。潜在问题包括NullPointerException(当包装类为null时拆箱)和性能开销。// 示例 Integer num = 10; // 自动装箱 int value = num; // 自动拆箱 // 问题示例:Integer num = null; int val = num; // 抛出NullPointerException
-
问题3:解释final关键字在变量、方法和类中的作用。
答案: final变量是常量(不可修改),final方法不可被子类重写,final类不可被继承。例如:final int MAX = 100;
或public final void display() {}
.
2. 集合框架
集合框架是高频考点,涉及List、Set、Map等。重点考察线程安全和性能。
-
问题1:ArrayList和LinkedList的区别?何时选择哪个?
答案: ArrayList基于数组,随机访问快$O(1)$,但插入删除慢$O(n)$;LinkedList基于链表,插入删除快$O(1)$,但访问慢$O(n)$。选择ArrayList用于频繁查询,LinkedList用于频繁修改。 -
问题2:HashMap的工作原理是什么?如何处理冲突?
答案: HashMap使用哈希表存储键值对。通过hashCode()计算桶位置,冲突时使用链表或红黑树(Java 8+)。例如:map.put(key, value)
会调用key.hashCode()
定位桶,若冲突,则遍历链表比较equals()。 -
问题3:ConcurrentHashMap如何保证线程安全?与Hashtable比较。
答案: ConcurrentHashMap使用分段锁或CAS(Java 8+),允许多线程并发读写,性能优于Hashtable(全局锁)。示例:ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
3. 多线程与并发
并发编程是高级主题,重点线程管理、锁机制。
-
问题1:创建线程有几种方式?各有什么优缺点?
答案: 两种方式:继承Thread类或实现Runnable接口。继承Thread简单但不利于扩展(Java不支持多继承),实现Runnable更灵活,可结合线程池。// 实现Runnable示例 class MyRunnable implements Runnable { public void run() { System.out.println("Thread running"); } } public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } }
-
问题2:解释synchronized关键字和ReentrantLock的区别。
答案: synchronized是内置锁,简单但功能有限;ReentrantLock是显式锁,支持公平锁、超时等。例如:synchronized void method() {}
vsLock lock = new ReentrantLock(); lock.lock();
-
问题3:什么是线程池?为什么使用Executor框架?
答案: 线程池管理线程生命周期,避免频繁创建销毁开销。Executor框架(如Executors.newFixedThreadPool)提供标准化API,提高资源利用率。代码示例:ExecutorService executor = Executors.newFixedThreadPool(4); executor.submit(() -> System.out.println("Task executed")); executor.shutdown();
4. JVM与性能优化
JVM是高级面试重点,涉及内存模型、GC等。
-
问题1:描述Java内存模型(JMM),包括堆、栈、方法区。
答案: JMM包括堆(存储对象实例,GC主要区域)、栈(存储局部变量和方法调用,线程私有)、方法区(存储类信息、常量,JDK 8后为元空间)。堆是共享内存区,需注意线程安全。 -
问题2:解释垃圾回收(GC)算法,如标记-清除、G1 GC。
答案: 标记-清除算法分两步:标记存活对象,清除未标记对象,但会产生碎片。G1 GC(Garbage-First)是Java 9+默认,将堆分Region,并行回收,目标低延迟。GC触发时机由堆大小阈值控制。 -
问题3:如何诊断内存泄漏?工具推荐。
答案: 使用工具如VisualVM或jmap分析堆转储,检查未释放对象(如静态集合)。示例命令:jmap -dump:format=b,file=heap.bin <pid>
然后用MAT分析。
5. 新特性与趋势(2025年重点)
针对2025年,关注Java 17+特性,如Records、Pattern Matching。
-
问题1:Java 17中的Record类是什么?有什么优势?
答案: Record是简化不可变类的语法糖,自动生成equals、hashCode等方法。优势:减少样板代码,提高可读性。// 示例 record Person(String name, int age) {} // 代替传统POJO Person p = new Person("Alice", 30); System.out.println(p.name()); // 自动getter
-
问题2:解释Pattern Matching for instanceof的用法。
答案: Java 16+引入,简化类型检查和转换。例如:if (obj instanceof String s) { System.out.println(s.length()); }
直接使用变量s。 -
问题3:什么是Project Loom?它将如何改变并发编程?
答案: Project Loom引入虚拟线程(轻量级线程),减少线程创建开销,2025年可能成为标准。它允许高并发应用更高效,代码类似传统线程但性能更好。
学习目录
学习内容
包含的内容比较多,这里只做了简单的截图介绍,全文共240万字,59个大专题,需要完整版的同学,直接查看下方名片!