一、Java 基础(必问)

  1. char 能存中文吗?能。char 占 2 字节,基于 Unicode 编码,覆盖常用汉字;生僻字若不在 Unicode 内则无法存储。

  2. == 和 equals 区别?

  • ==:基本类型比;引用类型比内存地址
  • equals:默认同 ==;String/Integer 等重写后比内容
  1. static 方法能调用非 static 方法吗?不能。static 方法属于类,非 static 属于对象;需先创建对象实例才能调用。

  2. Integer 和 int 区别?

  • int:基本类型,默认 0,无 null,占 4 字节。
  • Integer:包装类,默认 null,占更多内存,支持自动拆装箱;Web/ORM 场景优先用 Integer。
  1. String、StringBuffer、StringBuilder 区别?
  • String:不可变(final char []),线程安全,修改生成新对象。
  • StringBuffer:可变,线程安全(synchronized),多线程拼接用。
  • StringBuilder:可变,线程不安全,单线程拼接效率最高。
  1. 抽象类 vs 接口(JDK8+)
  • 抽象类:单继承,可含普通方法 / 成员变量,有构造器。
  • 接口:多实现,默认 public abstract;JDK8 + 支持 default/static 方法。
  1. final 关键字作用
  • 类:不可继承(如 String)。
  • 方法:不可重写。
  • 变量:常量,赋值后不可改。

二、集合框架(高频)

  1. HashMap 底层(JDK8)
  • 结构:数组 + 链表 + 红黑树(链表≥8 转红黑树,≤6 转回链表)。
  • 默认容量 16,负载因子 0.75,扩容为2 倍
  • 线程不安全:并发 put 可能覆盖值;多线程用ConcurrentHashMap
  1. ConcurrentHashMap(JDK8)
  • 弃用 Segment,用CAS+synchronized锁数组节点,锁粒度更细,并发更高。
  1. ArrayList vs LinkedList
  • ArrayList:数组,查询快(O (1)),增删慢(需扩容 / 移位)。
  • LinkedList:双向链表,查询慢(O (n)),增删快(改指针)。
  1. Collection vs Collections
  • Collection:集合顶层接口(List/Set 父接口)。
  • Collections:工具类,含 sort ()、shuffle () 等静态方法,不可实例化。

三、多线程与并发(重点)

  1. synchronized vs Lock
  • synchronized:关键字,自动加锁 / 释放,非公平锁,可重入。
  • Lock:接口,手动 lock ()/unlock (),支持公平锁、超时、中断,更灵活。
  1. 线程池 7 大参数
  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:非核心线程空闲超时
  • workQueue:阻塞队列
  • threadFactory:线程工厂
  • handler:拒绝策略(Abort/CallerRuns 等)
  1. sleep() vs wait()
  • sleep:Thread 方法,不释放锁,时间到自动唤醒。
  • wait:Object 方法,释放锁,需 notify ()/notifyAll () 唤醒,用于同步块。
  1. ThreadLocal 作用线程本地变量,每个线程独立副本,线程安全;用完务必 **remove ()** 防内存泄漏。

四、JVM(必问)

  1. JVM 内存区域
  • 堆:存对象实例,GC 主要区域(分新生代 / 老年代)。
  • 栈:存局部变量、方法栈帧,线程私有。
  • 方法区:存类信息、常量、静态变量(JDK8 后为元空间 Metaspace)。
  1. 垃圾回收算法
  • 标记 - 清除:产生内存碎片。
  • 标记 - 复制:适合新生代,无碎片,浪费空间。
  • 标记 - 整理:适合老年代,无碎片,效率低。
  1. 常见垃圾回收器
  • 新生代:Serial、ParNew、Parallel Scavenge。
  • 老年代:Serial Old、Parallel Old、CMS(已废弃)、G1(主流)。

五、框架(Spring/SpringCloud)

  1. Spring 循环依赖解决
  • 仅支持单例 + setter 注入;用三级缓存(singletonObjects/earlySingletonObjects/singletonFactories)提前暴露早期对象。
  1. SpringBoot vs SpringCloud
  • SpringBoot:快速构建单体服务,简化配置。
  • SpringCloud:微服务生态,解决服务注册 / 发现、熔断、负载均衡等。
  1. 服务熔断 vs 降级
  • 熔断:服务故障时切断调用,快速失败(如 Hystrix)。
  • 降级:高并发时舍弃非核心功能,保证核心可用。

六、分布式与高可用(进阶)

  1. 分布式锁实现
  • Redis:SETNX+EX(原子性)、Redisson(推荐,可重入)。
  • Zookeeper:临时顺序节点。
  1. Redis 三大问题及解决
  • 穿透:布隆过滤器 + 空值缓存。
  • 雪崩:过期时间随机 + 多级缓存。
  • 击穿:互斥锁(SETNX)+ 热点永不过期。
  1. 秒杀系统设计
  • 核心:削峰、限流、防超卖
  • 架构:CDN→网关限流→Redis 预减库存→MQ 异步下单→数据库(UPDATE ... WHERE stock>0)。

七、数据库(高频)

  1. MySQL 索引优化
  • 最左前缀原则、避免索引列计算、用覆盖索引减少回表、小表驱动大表。
  1. 事务隔离级别
  • 读未提交、读已提交(不可重复读)、可重复读(MySQL 默认,解决幻读)、串行化。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐