资讯中心

Java面试核心知识点:从基础到框架的深度解析

📅 2026/8/24 3:48:47
Java面试核心知识点:从基础到框架的深度解析
1. Java面试全攻略从基础到框架的深度解析作为一名经历过数十场技术面试的Java开发者我深知面试准备的重要性。这份面试题汇总不仅是我个人经验的总结更是结合了近年来一线互联网公司的真实面试题整理而成。无论你是初入职场的新人还是准备跳槽的资深工程师系统性地掌握这些核心知识点都能让你在面试中游刃有余。2. Java基础核心20问2.1 JDK与JRE的本质区别JDK(Java Development Kit)是Java开发工具包包含JRE和开发工具如编译器javac、调试工具jdb等。而JRE(Java Runtime Environment)仅包含运行Java程序所需的JVM和核心类库。简单来说开发者需要安装JDK而最终用户只需JRE即可运行Java程序。实际开发中常见误区在服务器环境只安装了JRE导致无法使用javac等工具。建议生产环境也安装JDK以便排查问题。2.2 与equals的深度比较比较的是对象的内存地址而equals比较的是对象的内容。但要注意Object类中默认的equals实现其实就是比较所以自定义类需要重写equals方法。重写equals时必须同时重写hashCode()否则会导致HashMap等集合类工作异常。// 典型equals方法实现 Override public boolean equals(Object o) { if (this o) return true; if (o null || getClass() ! o.getClass()) return false; MyClass myClass (MyClass) o; return field1 myClass.field1 Objects.equals(field2, myClass.field2); }2.3 hashCode与equals的契约关系当两个对象的hashCode()相同时equals()不一定为true哈希冲突。但equals()为true时hashCode()必须相同。这个契约关系是Java集合框架正常工作的基础。违反这一规则会导致HashSet/HashMap等集合无法正确识别相同对象。2.4 final关键字的三种应用场景final类不可被继承如String类final方法不可被重写final变量基本类型值不可变引用类型引用不可变但对象内容可变在并发编程中final变量能保证可见性是一种简单的线程安全手段。2.5 字符串处理最佳实践String是不可变类每次修改都会创建新对象。对于频繁修改的场景应使用StringBuilder非线程安全或StringBuffer线程安全。JDK9后字符串底层改用byte[]存储并引入了紧凑字符串优化。// 字符串反转的几种方式 String str hello; new StringBuilder(str).reverse().toString(); // 最佳实践 new StringBuffer(str).reverse().toString(); // 线程安全版3. Java容器深度解析3.1 HashMap实现原理与优化JDK8中的HashMap采用数组链表红黑树结构。当链表长度超过8且数组长度大于64时链表会转为红黑树。扩容因子默认为0.75即元素数量达到容量的75%时进行2倍扩容。// HashMap初始化最佳实践 MapString, Integer map new HashMap(16); // 给定初始容量避免频繁扩容3.2 ArrayList与LinkedList的性能对比ArrayList基于动态数组随机访问快(O(1))但插入删除慢(O(n))LinkedList基于双向链表插入删除快(O(1))但随机访问慢(O(n))。实际开发中查询多用ArrayList频繁增删考虑LinkedList。经验之谈90%场景下ArrayList表现更好因为现代CPU缓存对数组遍历有优化。只有当头部频繁插入时才考虑LinkedList。3.3 线程安全容器选型指南Hashtable全表锁性能差Collections.synchronizedMap包装器模式性能一般ConcurrentHashMap分段锁(JDK7)或CASsynchronized(JDK8)高并发首选CopyOnWriteArrayList读多写少场景适用4. 并发编程核心知识点4.1 线程池的7个核心参数ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 工作队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 )4.2 synchronized底层实现原理JDK6之后synchronized进行了重大优化引入了偏向锁、轻量级锁、重量级锁的升级机制偏向锁MarkWord记录线程ID适用于单线程访问场景轻量级锁通过CAS竞争MarkWord重量级锁向操作系统申请互斥量4.3 volatile的内存语义volatile保证可见性和有序性禁止指令重排序但不保证原子性。其底层通过内存屏障实现写操作前插入StoreStore屏障写操作后插入StoreLoad屏障读操作前插入LoadLoad屏障读操作后插入LoadStore屏障5. Spring框架面试精要5.1 IOC容器的启动流程资源定位找到配置文件加载解析将配置转化为BeanDefinition注册将BeanDefinition存入注册表依赖注入实例化Bean并解决依赖关系初始化执行init-method等回调5.2 Spring事务传播行为详解传播行为类型说明REQUIRED默认当前有事务则加入没有则新建REQUIRES_NEW新建事务挂起当前事务NESTED嵌套事务使用保存点实现SUPPORTS有事务则加入没有则以非事务运行NOT_SUPPORTED以非事务方式运行挂起当前事务MANDATORY必须在事务中运行否则抛出异常NEVER必须在非事务中运行否则抛异常5.3 Spring MVC请求处理流程DispatcherServlet接收请求HandlerMapping找到处理器HandlerAdapter执行处理器处理器返回ModelAndViewViewResolver解析视图视图渲染并返回响应6. 数据库与持久层技术6.1 MyBatis缓存机制对比缓存级别作用范围生命周期开启方式一级缓存SqlSession会话级别默认开启无需配置二级缓存Mapper级别应用级别需手动配置标签踩坑提醒二级缓存可能导致脏读在分布式环境下建议使用Redis等集中式缓存替代。6.2 MySQL索引优化原则最左前缀原则联合索引(a,b,c)只能用于a、ab、abc查询避免在索引列上使用函数WHERE YEAR(create_time)2022会导致索引失效使用覆盖索引减少回表字符串字段建立前缀索引区分度高的列适合建索引区分度不重复数/总数7. 分布式与微服务7.1 Spring Cloud核心组件服务注册发现Eureka/Nacos客户端负载均衡Ribbon声明式HTTP客户端Feign服务熔断降级Hystrix/Sentinel网关Zuul/Gateway配置中心Config/Nacos消息总线Bus7.2 RabbitMQ消息可靠性保证生产者确认模式publisher confirm消息持久化deliveryMode2消费者手动ACK死信队列处理失败消息集群镜像队列防止节点故障8. JVM性能调优实战8.1 内存区域与OOM分析区域作用常见OOM原因堆对象实例内存泄漏/大对象方法区类信息动态生成类过多虚拟机栈方法调用递归过深本地方法栈Native方法JNI代码问题程序计数器执行位置不会OOM8.2 GC算法与收集器选择Serial单线程适合客户端应用Parallel Scavenge吞吐量优先CMS低延迟JDK9开始废弃G1平衡型JDK9默认ZGC超低延迟JDK15生产可用调优经验多数应用使用G1即可-Xmx和-Xms设为相同值避免动态调整Young区大小约占堆的1/3到1/2。9. 设计模式实战案例9.1 Spring中的设计模式应用工厂模式BeanFactory代理模式AOP实现单例模式Bean默认作用域模板方法JdbcTemplate观察者模式ApplicationEvent适配器模式HandlerAdapter9.2 单例模式的7种实现从最简单的饿汉式到复杂的枚举单例需要考虑线程安全、序列化、反射攻击等问题。当前最佳实践是使用枚举实现public enum Singleton { INSTANCE; public void doSomething() { // ... } }10. 线上问题排查工具箱10.1 Arthas常用命令dashboard系统实时监控面板thread查看线程堆栈jad反编译类文件watch方法执行数据观测trace方法调用链路追踪ognl执行ognl表达式10.2 性能问题定位步骤top命令确认CPU/内存异常进程jps/jinfo查看Java进程基本信息jstack分析线程状态jmap/jstat分析内存使用arthas/btrace进行动态诊断结合日志和Metrics定位根源在实际面试中除了正确回答问题外展示解决问题的思路同样重要。比如被问到HashMap原理时可以先讲基本结构再延伸到线程安全问题最后谈到ConcurrentHashMap的优化这样能体现知识的系统性和深度。