引言:为什么Java容不得半点马虎
\n\n你投递了简历,通过了HR筛选,现在——收到了技术面试邀请。如果你正在pythonlib.ru上阅读这篇文章,那么你要么是从Python转向Java,要么只是在整理“知识库”。无论如何——你走在正确的道路上。
\n\nJava不是那种可以靠“魅力”蒙混过关的语言。企业级生态系统要求你清晰理解:从JMM(Java内存模型)到垃圾回收器(Garbage Collector)的工作原理。Java面试不是考试,而是一场对话。但这是一场会考验你实力的对话。
\n\n在这篇文章中,我整理了一份真实的检查清单:学什么、如何回答,以及——最重要的是——如何在现场编程中不丢脸。全是干货,没有废话。
\n\n1. Java核心:必须烂熟于心的基础
\n\n从基础开始。没有Java核心知识,根本没人会听你说话。以下是每位候选人必须掌握的 topics 列表:
\n\n1.1. 面向对象编程(OOP)
\n你必须能够用简单易懂的方式解释多态、继承、封装和抽象,并且要附带例子。
\n\n陷阱问题:“抽象类和接口有什么区别?”
\n正确答案:在Java 8+中,接口引入了default方法,但抽象类可以包含状态(字段),而接口不能。
\n\n// 示例:抽象类\nabstract class Animal {\n protected String name;\n abstract void makeSound();\n}\n\n// 带有default方法的接口\ninterface Movable {\n default void move() {\n System.out.println("Moving...");\n }\n}\n\n1.2. 集合(Java Collections Framework)
\n这是必备知识。仅仅知道HashMap、ArrayList、HashSet、TreeMap是不够的。你需要理解:
\n- \n
- HashMap的工作原理(数组 + 链表 + 红黑树,自Java 8起) \n
- fail-fast和fail-safe迭代器的区别 \n
- 何时使用LinkedList代替ArrayList(剧透:几乎从不) \n
建议:面试中可能会要求你实现自己的HashMap。提前练习一下。
\n\n1.3. 异常(Exceptions)
\nChecked vs Unchecked——经典问题。记住:RuntimeException及其子类是unchecked异常,其余都是checked异常。并且永远,听好了,永远不要使用catch (Exception e) {}——这是一种反模式。
2. 多线程:80%候选人翻车的主题
\n\nJava是少数几种在语言层面内置多线程支持的编程语言之一。面试中一定会问到synchronized、volatile、AtomicInteger、Lock、Semaphore。
\n\n2.1. volatile关键字
\n关键问题:“volatile保证原子性吗?”答案:不。它只保证线程之间对变量修改的可见性。
\n\npublic class VolatileExample {\n private volatile boolean flag = true;\n\n public void stop() {\n flag = false; // 另一个线程会立即看到这个变化\n }\n}\n\n2.2. 死锁及其避免方法
\n可能会要求你编写导致死锁的代码,然后修复它。
\n\n// 经典死锁\npublic class DeadlockExample {\n private final Object lock1 = new Object();\n private final Object lock2 = new Object();\n\n public void method1() {\n synchronized (lock1) {\n synchronized (lock2) { /* ... */ }\n }\n }\n\n public void method2() {\n synchronized (lock2) {\n synchronized (lock1) { /* ... */ }\n }\n }\n}\n\n解决方案:始终以相同的顺序获取锁,或者使用java.util.concurrent.locks包中的tryLock()方法。