
Java 面试知识点梳理一、Java 基础1.1 面向对象三大特性1.2 重载 vs 重写1.3 数据类型1.4 与 equals / hashCode二、集合框架2.1 体系概览2.2 ArrayList vs LinkedList2.3 HashMap必考2.4 ConcurrentHashMap三、并发编程重灾区3.1 线程的创建3.2 线程状态3.3 synchronized 与 ReentrantLock3.4 线程池必考3.5 JMM 与三大特性四、JVM高频4.1 运行时数据区4.2 垃圾回收4.3 类加载五、异常六、反射与注解七、Java 8 新特性八、IO 与 NIO九、易踩坑清单十、高频面试题 30 连击定位Java / 后端开发岗面试速通。用法每个模块先看核心结论再看面试题最后对照易踩坑。一、Java 基础1.1 面向对象三大特性特性说明面试要点封装隐藏实现暴露接口访问修饰符 private/protected/public继承子类复用父类单继承super调用父类构造方法重写多态父类引用指向子类对象编译看左、运行看右重写实现运行时绑定1.2 重载 vs 重写重载overload同一类、同名、参数列表不同个数/类型/顺序与返回值和访问修饰符无关。重写override子类覆盖父类方法方法签名一致访问权限不能更严抛出的异常不能更宽。1.3 数据类型8 种基本类型byte short int long float double char boolean其余均为引用类型。装箱/拆箱Integer等包装类缓存 -128~127IntegerCache比较该区间会命中缓存。String不可变底层final char[]JDK9 后为byte[]拼接编译器优化为StringBuilder。1.4与equals/hashCode基本类型比值引用类型比地址。equals默认比地址重写后比内容String已重写。hashCode相等对象hashCode必相等hashCode相等对象不一定equals相等。重写equals必须重写hashCode否则 HashMap 失效。二、集合框架2.1 体系概览Collection ├─ List有序可重复ArrayList / LinkedList / Vector └─ Set不可重复HashSet / LinkedHashSet / TreeSet Map键值对HashMap / LinkedHashMap / TreeMap / Hashtable / ConcurrentHashMap2.2 ArrayList vs LinkedList维度ArrayListLinkedList底层动态数组双向链表随机访问O(1)O(n)插入删除中间O(n) 搬移O(1) 改指针内存连续省节点额外开销2.3 HashMap必考JDK 1.8 结构数组 链表 红黑树。默认容量 16负载因子 0.75阈值 容量 × 0.75。扩容超过阈值 resize 为 2 倍元素重新散列低位/高位拆分无需重算 hash。链表树化链表长度 ≥ 8 且数组容量 ≥ 64 转为红黑树树节点 ≤ 6 退化为链表。线程不安全并发put可能数据覆盖或死循环1.7 头插1.8 已修复死循环但仍不安全。2.4 ConcurrentHashMapJDK 1.7Segment分段锁继承 ReentrantLock默认 16 段并发度 16。JDK 1.8Node数组 链表/红黑树put用CAS synchronized锁单个桶头节点更细粒度效率更高。三、并发编程重灾区3.1 线程的创建继承Thread/ 实现Runnable/ 实现Callable有返回值、Future获取/ 线程池。3.2 线程状态NEW → RUNNABLE → BLOCKED / WAITING / TIMED_WAITING → TERMINATEDsleep不释放锁休眠后自动恢复。wait释放锁需notify/notifyAll唤醒必须在synchronized内。3.3synchronized与ReentrantLock维度synchronizedReentrantLock实现JVM 内置监视器锁API 层面AQS释放自动代码块结束/异常手动unlock放 finally公平非公平可公平/非公平中断不可中断可中断lockInterruptibly条件单一等待队列多Conditionsynchronized锁升级无锁 → 偏向锁 → 轻量级锁CAS 自旋→ 重量级锁操作系统互斥。3.4 线程池必考7 个参数corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime空闲线程存活时间unit时间单位workQueue任务队列ArrayBlockingQueue / LinkedBlockingQueue / SynchronousQueuethreadFactory线程工厂handler拒绝策略处理流程核心线程满 → 入队 → 队列满 → 开非核心线程 → 达最大线程 → 触发拒绝策略。4 种拒绝策略AbortPolicy抛异常默认/CallerRunsPolicy调用者线程执行/DiscardPolicy丢弃/DiscardOldestPolicy丢最旧。3.5 JMM 与三大特性原子性synchronized、Lock、原子类AtomicInteger。可见性volatile、synchronized、final。有序性volatile禁止指令重排happens-before原则。volatile不保证原子性如i非原子适合状态标志位。CAS比较并交换无锁乐观ABA 问题用AtomicStampedReference加版本号解决。AQS抽象队列同步器ReentrantLock/Semaphore/CountDownLatch 的底层基础state CLH 队列。四、JVM高频4.1 运行时数据区线程私有程序计数器、虚拟机栈栈帧/局部变量表、本地方法栈。线程共享堆对象实例GC 主战场、方法区JDK8 后为元空间 Metaspace存类信息/常量/静态变量。4.2 垃圾回收判断存活引用计数循环引用失效/可达性分析GC Roots 不可达即回收主流。GC Roots栈帧局部变量、静态变量、常量、JNI 引用。回收算法标记-清除碎片/ 标记-整理慢/ 复制新生代效率高。分代收集新生代Eden 2 SurvivorMinor GC复制算法→ 老年代Major/Full GC标记-整理。垃圾回收器Serial单线程/ Parallel吞吐优先/CMS并发标记清除低停顿已弃用/G1Region 化可预测停顿主流/ ZGCTB 级、亚毫秒停顿。4.3 类加载双亲委派自底向上委托父加载器父不能加载才自己加载避免类重复、保证核心类安全。破坏场景SPIJDBC、热部署、Tomcat WebAppClassLoader。OOM 常见堆溢出-Xmx调大/查内存泄漏、栈溢出递归过深、元空间溢出类加载过多。五、异常Throwable→Error严重不可捕获如 OOM/Exception。Exception→RuntimeException非受检空指针/越界/ 受检异常必须 try 或 throws如 IOException。finally始终执行除非System.exitreturn前先执行finallyfinally 的 return 会覆盖。六、反射与注解反射运行时获取类信息并操作Class.forName/getDeclaredMethod/setAccessible(true)突破私有。代价性能略低、破坏封装。注解Override/Deprecated/FunctionalInterface元注解TargetRetentionDocumentedInheritedRetention(RUNTIME)才能反射读取。七、Java 8 新特性Lambda函数式接口FunctionalInterface仅一个抽象方法。Stream APIfilter/map/reduce/collect惰性求值、可并行parallelStream。Optional优雅判空避免 NPE。接口默认方法default方法、静态方法。新日期 APILocalDate/LocalDateTime/DateTimeFormatter线程安全替代SimpleDateFormat。方法引用::。八、IO 与 NIOBIO流InputStream/OutputStream阻塞、面向流。NIOChannelBufferSelector非阻塞、多路复用适合高并发Netty 基础。AIONIO.2异步回调。九、易踩坑清单坑现象解决遍历 List 时removeConcurrentModificationException用迭代器remove或removeIfsubstring内存泄漏JDK6长字符串截取后旧大字符串不释放JDK7 已修复新建数组用比包装类-128~127 外为 false用equals重写equals不写hashCodeHashMap 查找失败成对重写i多线程结果不对AtomicInteger/synchronizedSimpleDateFormat多线程日期错乱局部变量 /DateTimeFormatter线程池用Executors创建OOM 风险无界队列/无限线程用ThreadPoolExecutor自定义HashMap并发写数据丢失用ConcurrentHashMap十、高频面试题 30 连击面向对象三大特性重载和重写区别与equals区别为何重写 equals 要重写 hashCodeString 为什么不可变Integer 缓存范围ArrayList 与 LinkedList 区别HashMap 底层结构与扩容为何链表 8 转红黑树ConcurrentHashMap 1.7 与 1.8 区别创建线程有几种方式sleep 与 wait 区别synchronized 锁升级过程synchronized 与 ReentrantLock 区别volatile 能保证原子性吗线程池 7 参数与处理流程四种拒绝策略为什么不建议用 Executors 创建线程池CAS 是什么ABA 怎么解决AQS 原理JVM 内存区域划分何时发生栈溢出 / 堆溢出如何判断对象可回收垃圾回收算法有哪些G1 与 CMS 区别双亲委派模型及破坏场景类加载过程受检与非受检异常区别反射的原理与代价Java 8 有哪些新特性BIO、NIO、AIO 区别