本文内容来自陌陌、美团、阿里、链家、快手、京东、瓜子、滴滴、百度、爱奇艺、vivo等十多个公司最近三年的100多篇面经中比较高频的总结,有的是校招的有的是实习的,不过不影响学习。学习嘛,反正都得学。

一、JVM

1. JVM内存结构

  • JVM的分区(Java的内存管理机制)(JAVA 的运行时区域分配):都说的是JVM的内存结构
  • JVM哪个区域不会发生内存溢出

    2. 类加载器

  • JVM 类加载机制

  • class 文件如何执行
  • 为什么要引入双亲委派机制
  • 什么情况下用自定义类加载器

    3. 反射

  • 写一段反射的代码

    4. GC

  • 哪些阶段会发生STW现象

  • G1垃圾回收为什么可停顿
  • GC的工作流程
  • FULL GC发生场景
  • 如何打印GC日志
  • 经常FULL GC怎么定位到错误
  • GC可达性分析怎么做,哪些可以作为GC Root
  • CMS收集器和G1垃圾回收器回收垃圾过程
  • G1的优点
  • 垃圾回收的过程,什么对象会进入老年代
  • 垃圾回收算法有哪些?为什么新生代使用复制算法
  • 高吞吐量时用哪种GC算法、
  • 执行了System.gc()触发GC机制后如何进行回收的

    5. 其他

  • JVM排错方式

  • 内存泄露的原因,举例说明
  • 如何排查内存泄露
  • JVM启动参数有哪些,列举熟悉的几个
  • JVM为什么分新生代和老年代
  • 系统周期性卡顿,如何定位问题,结合GC日志
  • 在 JVM上运行一段Java 程序输出一条语句,它是怎么输出到屏幕上的

    二、 并发

    1. 锁

  • Java 中的锁机制

  • 为什么需要锁
  • 介绍下几种锁
    • 公平锁和非公平锁的区别
    • 悲观锁和乐观锁
    • 可重入锁与非可重入锁
    • 自旋锁与阻塞锁
  • Synchronized
    • Synchronized和ReetrantLock的区别
    • Synchronized的偏向锁、轻量级锁、重量级锁
    • Synchronized关键字的底层原理
  • Reentrantlock
    • Reentrantlock 有哪些方法
    • 有Synchronized了为什么还需要Reentrantlock
    • tryLock()在什么场景下用
  • 读锁插队策略,锁升降级策略
  • 如何优化锁并提高并发性能

    2. 线程池

  • 线程池是如何实现的

  • 使用线程池带来的好处
  • 常见的线程池有哪些,各个参数的意义
  • 执行线程池的两种方式
  • 线程池怎么定时完成一项任务?
  • 线程池线程都有任务,阻塞队列也满了,再来任务怎么办?
  • Java 线程池 ThreadPoolExecuter 和四个自带的线程池分别适合什么场景?
  • ScheduledThreadPoolExecutor 中的使用的是什么队列?内部如何实现任务排序
  • 线程池常见的拒绝策略
  • 如何优雅的关闭线程池
  • 如何设计一个简单的线程池

    3. 并发类

  • 怎么实现一个类满足插入和删除操作的原子性

  • JUC原子类的实现原理
  • AQS的原理和应用场景
  • CAS的底层原理和应用场景,ABA问题
  • 怎么实现一个线程安全的计数器? 原子类 AtomicInteger 实现原理是什么?和你设计的计数器优劣比较? CAS 怎么实现原子操作的?
  • ThreadLocal
    • ThreadLocal 的应用场景
    • ThreadLocal 与Thread的关系
    • ThreadLocal 使用不当为什么会发生内存溢出?怎么避免
  • CopyOnWriteList
    • CopyOnWriteArrayList 与ArrayList相比有哪些异同?
    • CopyOnWriteArrayList 通过哪些手段实现了线程安全?
    • 为什么 CopyOnWriteArrayList 迭代过程中,数组结构变动,不会抛出ConcurrentModificationException ?
    • CopyOnWriteArrayList对批量数据进行写操作时需要怎么优化
  • ConcurrentHashMap
    • ConcurrentHashMap 和 HashMap 的相同点和不同点
    • ConcurrentHashMap 通过哪些手段保证线程安全
    • CAS 算法在 ConcurrentHashMap 中的应用
    • ConcurrentHashMap 是如何发现当前槽点正在扩容的?
    • 发现槽点正在扩容时,put 操作会怎么办?
    • ConcurrentHashMap 和HashMap的扩容有什么不同?
    • ConcurrentHashMap 在 Java 7 和 8 中关于线程安全的做法有啥不同?
    • 为什么超过冲突超过8才将链表转为红黑树而不直接用红黑树
  • 阻塞队列

    • 哪些队列具有阻塞的功能,大概是如何阻塞的?
    • LinkedBlockingQueue 和 ArrayBlockingQueue 的区别?
    • 往队列里 put 数据和take数据是线程安全的么?为什么?
    • take和put方法是不是同一时间只能运行其中一个
    • SynchronousQueue 底层有几种数据结构,两者有何不同?
    • 如果想使用固定大小的队列,有几种队列可以选择,有何不同?
    • ArrayBlockingQueue 的take 和 put 都是怎么找到索引位置的?是利用 hash 算法计算得到的么?

      4. 线程

  • 进程和线程的区别

  • Java进程与线程的关系
  • 进程之间常见的通信方式
  • 有多少种实现线程的方法?
  • Java 怎么实现线程安全的
  • Java 中线程如何交互
  • 实现Runnable接口和继承Thread类哪种方式更好?
  • 一个线程两次调用start()方法会出现什么情况?为什么?
  • 既然start()方法会调用run方法,为什么我们选择调用start方法而不是直接调用run方法呢?
  • 多线程中断的原理
  • 如何正确停止线程
  • 线程有哪几种状态?生命周期是什么?
  • 什么是生产者消费者模式
  • 为什么wait方法需要在同步代码块内使用,而sleep不需要
  • wait方法是属于Object对象的,那调用Thread.wait()会怎么样
  • 为什么线程通信的方法wait、notify、notifyAll被定义在Object类中?而slepp方法被定义在Thread类中?
  • wait/notify、sleep异同
  • yield和sleep的区别
  • 在join期间,线程处于哪种线程状态?
  • notifyAll之后所有的线程都会再次抢夺锁,如果某线程抢夺失败怎么办?
  • 守护线程和普通线程的区别?我们是否需要给线程设置守护线程?
  • 什么是多线程的上下文切换
  • 为什么多线程会带来性能问题?
  • 单例模式的作用和适用场景
  • 分布式集群中如何保证线程安全?

    5. volatile

  • volatile有什么作用,什么时候发生指令重排

  • 什么时候适合用vilatile
  • volatile 关键字的底层实现, volatile 是不是原子性的

    6. Java内存模型

  • Java内存模型和JVM内存结构有什么不同

  • 什么是Java内存模型,为什么会出现Java内存模型
  • i++是线程安全的么,从 Java 内存模型来分析,如何保证它是安全的
  • 什么是原子性问题,Java中有哪些原子操作
  • new一个对象的过程是否是原子的
  • 什么是可见性问题,为什么会出现,又如何解决
  • 什么是重排序(有序性问题),重排序有什么意义
  • 列举几条happens-before规则

    三、 Java基础

1. 数据类型

  • String
    • 为什么String类型要用final修饰?
    • equals和‘==’的区别是什么?
    • String几种拼接方式区别,+和 append 底层有没有区别
    • String 为什么是不可变的
    • String 和 StringBuilder、StringBuffer 有什么区别?
    • String 的intern()方法有什么含义?(1.6和1.7)
    • String 是值传递还是引用传递
    • String类型在JVM中如何存储的(字符串常量池相关 比较1.6和1.7)
  • float和double的精度,底层存储方式,和decimal有什么区别
  • Integer 与 int 区别(包含自动拆装箱)
  • 8个基本数据类型和对应的包装类
  • Atomic Integer 和 Integer 区别。 Atomic Integer 原理
  • char 类型能否存储一个中文字符?

    2. 设计模式

  • 单例模式

    • 手写你认为最好的单例模式(枚举生产环境最佳,面试双重检查最优逼格,静态内部类也比较优)
    • 饿汉式和懒汉式的区别和各自的优缺点
  • 解释几个常用的设计模型,从项目出发

    3. Java基本概念

  • 重写和重载区别

  • JDK、JRE和JVM的区别和联系
  • Java中小数是怎么存的
  • static 方法和实例方法的区别
  • Java 中的 error 和 exception的区别,Java 异常体系
  • 抽象类和接口的区别
  • Java 接口能定义方法体吗(1.7和1.8比较)
  • 抽象类中可以有实现方法吗,它和普通方法的区别
  • 不可变类和不可变对象
  • final的三种用法
  • 什么时候用抽象类,什么时候用接口
  • Java Object 类中常用方法
  • ==和 equals 和 hashcode()的区别
  • enum 构造方法是公共还是私有的?
  • 强引用、软引用、弱引用、幻象引用有什么区别?

    4. 集合类

  • HashMap

    • HashMap的底层实现结构(1.7和1.8)
    • hash()和 equals()方法的区别
    • HashMap 如何获取 key?
    • HashMap 的初始容量,加载因子,扩容增量
    • HashMap 扩容为什么是 2 倍不是 3 倍(HashMap的长度为什么是2的整数幂值)
    • 加载因子为什么默认0.75
    • HashMap的存储和获取流程(1.7和1.8)
    • HashMap扩容的步骤(1.7和1.8)
    • 解决Hash冲突的方法Hashtable、HashMap、TreeMap 有什么不同?
    • 举例说明HashMap是线程不安全的
    • ConcurrentHashMap和Hashtable的区别?
    • 为什么JDK1.8会HashMap会把链表转为红黑树
  • ArrayList
    • Vector、ArrayList和LinkedList有哪些区别?
    • ArrayList 是怎么扩容的?初始化时给定 ArrayList 的 size,数组大小一定就是给定值吗
    • ArrayList 和 LinkedList 的区别?插入、删除、访问的时间复杂度?
    • Arraylist 和 Linkedlist 在尾部插入一个节点,哪个更快
  • HashSet和TreeSet有哪些区别?
  • Collection和Collections有什么关系?
  • LinkedHashMap和TreeMap的区别(两个有序)

    5. maven 遇到版本不匹配的问题怎么解决

    6. 序列化和反序列化怎么实现,自己设计会怎么做

    7. 对 Java7、 8 的新特性有什么了解

    8. BIO、NIO、AIO 的区别和联系

    9. main 方法声明成 private 可以通过编译嘛?

    10. 对称加密和非对称加密

    11. REASTful API 的规范,REASTful是实现机制,keepalive作用

    12. lombok 底层实现怎么实现注解?

    13. 对象头中有哪些信息

    14. 什么是 rpc 框架?和 http 调用的区别是什么?

    15. kafka如何保证数据可靠性

四、 数据库

1. MYSQL

  • MYSQL索引在什么情况下会失效
  • MYSQL的分区
  • MYSQL的存储引擎:底层实现、对比、适用场景
  • B 树, B+树在数据库存储中的作用、区别
  • MYSQL的组合索引(最左前缀匹配原则) , 建立了 A,B,C 三 个 列 的 组 合 索 引 A=1andB=1,A=1andC=1,A=1andB>1andC=1,A=1 order by B,这几种情况,哪种情况组合索引生效、
  • MYSQL的分库分表,分库分表后如何保证分布式id
  • MYSQL什么时候发生死锁
  • MYSQL的 innodb 引擎为什么不用 B 树
  • MYSQL的主从复制原理,如何实现
  • 如果是存储日志,用什么存储引擎比较合适
  • MYSQL的锁有哪几种,行锁的实现原理
  • 一条SQL在MYSQL中的执行过程
  • MYSQL查询缓存在什么时候触发?什么时候失效

    2. Redis

  • Redis有哪些数据结构

  • Redis的应用场景,过期策略
  • Redis 集群设计方案
  • Redis的持久化机制,应用场景
  • Redis为什么那么快
  • 为什么使用 redis 做消息队列
  • Redis缓存穿透,缓存雪崩,以及如何解决
  • Redis有序集合的底层数据结构,为什么用跳表 压缩列表比纯用跳表好
  • AOF重写实现原理
  • Redis分布式锁的加锁解锁详细实现
  • 分布式锁和锁区别,什么时候用,怎么考虑的
  • Redis 的内存淘汰策略 LRU

    3. 数据库

  • ACID特性

  • SQL优化
  • 聚簇索引和非聚簇索引
  • 数据库范式
  • 索引失效的情况?对于非聚集索引查询的过程?
  • 索引的几种类型
  • 索引的底层实现
  • 索引的缺点
  • 对于 Gender 这种 2 个属性的需要建索引吗?对于 varchar 怎么建索引?
  • “like”查询在什么时候能够用上索引
  • 数据库事务的隔离级别分别是什么,有什么作用
  • 设计一个数据表实现树的结构
  • 事务隔离级别有什么?通过什么来实现的?分别解决了什么问题?
  • SQL 慢查询的常见优化步骤是什么
  • varchar 和 char 的区别
  • 说下乐观锁,悲观锁(select for update),并写出 SQL实现
  • 数据库中存储密码是怎么存的,还知道其他加密方式吗
  • 索引(A,B,C),如果 where 条件里只用 B,索引使用情况。如果 where 条件里只用(B,C)呢?
  • 怎么保证缓存和数据库双写一致(MySQL 和 Redis缓存数据不一致)
  • A 和 B 两个用户同时插入两条相同的数据,如何保证表里面只有一条

五、网络

1. 三次握手四次挥手

  • 三次握手的原因、每次握手的数据包
  • 四次挥手的原因,每次挥手的数据包
  • 两次握手行不行啊
  • 首次握手的隐患-SYN超时
  • 三次握手要是服务端的服务没开TCP协议栈怎么处理
  • 关闭连接时TIME_WAIT的作用
  • 挥手时最后一次ACK如果客户端没收到怎么办

    2. HTTP

  • HTTP1.0和1.1的区别

  • HTTP请求的方法有哪些
  • Get和Post请求的区别
  • HTTP常用状态码
  • 对 HTTPS有什么了解
  • HTTP和HTTPS的区别

    3. TCP/UDP

  • TCP和UDP的区别

  • TCP和UDP包的区别
  • UDP如何实现可靠传输
  • TCP和HTTP的区别
  • TCP协议-如何保证传输可靠性

    4. 综合应用

  • 一个网站请求从客户端到服务器端的过程

  • 一个网页从输入 URL 到服务器接收到请求所经历的过程?

    5. 五层网络协议和 OSI七层网络协议

  • 各层的主要功能是什么

  • TCP 协议在哪一层? IP 协议在那一层? HTTP 在哪一层?

    6. DNS 寻址过程

    7. ARP原理

    8. 长连接和短连接

六、 框架

1. Spring

  • Spring框架的启动流程
  • IOC和AOP的实现原理
  • 写一个简易的IOC和AOP
  • Spring的优点有哪些
  • Spring Bean都是单例的吗
  • Spring Bean的生命周期
  • Spring Bean的作用域
  • Spring Bean 什么时候用原型模式
  • Spring如何解决循环依赖,解决哪一种循环依赖
  • cglib 和 jdk 的动态代理的实现原理?这两者之间性能的区别?
  • 动态代理用多了之后对内存方面有什么影响嘛?
  • Spring的事务隔离级别
  • Spring的事务的传播行为

    2. SpringMVC

  • SpringMVC 工作流程

  • SpringMVC请求URL的步骤,如果请求图片有什么不同
  • SpringMVC的Controller是线程安全的吗
  • @Autowired 的实现原理
  • @Controller,@Service,@Repository,@Componen注解的区别
  • @Resource、@Qualifier和@Autowired区别注解的区别
  • SpringMVC的 dispatcherservlet 的分派原理

    3. Spring Boot的优点,Spring、 SpringMVC、 SpringBoot 的区别

    4. Web基础

  • servlet的生命周期

  • 过滤器的生命周期
  • Jsp九大内置对象
  • Jsp的四个域对象
  • Session和Cookie的区别
  • MVC设计思想

    5. MyBatis

  • MyBatis与Hibernate的区别

  • MyBatis的核心组件有哪些?
  • DAO接口中的方法可以重载吗(重点)
  • MyBatis的动态SQL
  • MyBatis的一二级缓存
  • MyBatis的# $区别的区别
  • MyBatis的接口绑定以及实现方式

七、 场景题(开拓思维)

  1. 字符串数目从0开始,一直往后递增,字符串大小不需要考虑,只是字符串的数量不断增加,在高并发的情况下,QPS十几万时,怎么生成这个确定的唯一id,还可以保证下次查询时高效率的查到
  2. 对于一个 10 亿的数据,如何统计里面重复数前 10 多的单词?
  3. 场景设计,商品表,一共 100 件商品,如何保障多用户购买商品时,商品数量不会出现负数,并且保证效率最高
  4. 利用 0 到 9, a 到 z 大小写都算上,生成一个 6 位的随机密码,怎么实现?
  5. 如果一个外卖配送单子要发布,现在有 200 个骑手都想要接这一单,如何保证 只有一个骑手接到单子?
  6. 假设从 2G 访问 meituan. com 变成了 4G 访问 meituan.com,OSI 七层模型,哪一层变了,为什么
  7. 一个保存字符串的超大文件,如何判断一个字符串在不在这个文件
  8. 如果说有一个操作需要创建一个对象,这个对象很大,需要消耗很多资源,如果说每调用一次方法就创建一个对象的话,开销太大,如果把它定义成一个静态变量,又会产生并 发问题,那么多线程并发操作的时候就需要加锁,降低效率。怎么优化才能既不用加锁又能提高并发访问的效率?
  9. 如果现在有 8G 内存,一个程序很大,由于还要留下一部分内存供其他程序使用,那么如何控制这个程序使其占用的内存不能超过 6G 呢?
  10. 对于一个容器,比如 set,你想实现自定义排序规则的话怎么做
  11. 数据库中一行记录大小 10K,一个表只有主键索引,可以存多少条数据
  12. 你有没有试过数据库一个表中最多可以插入多少数据
  13. 一个 6 位的密码,使用 MD5 加密,破解需要多久:说的是这样的,因为 6 位的密码排列组合有一定的种数,然后每一种通过 hash 函数去破解,需要多久
  14. 我有 8 件事要做,最要要同意返回处理结果,每件事要进行异步的方式去做。你怎么完成这个需求
  15. 我需要在项目启动时,将一些配置加载到内存中,你有什么方式能解决
  16. 10g 文件,只有 2g 内存,怎么查找文件中指定的字符串出现位置
  17. 100w 个数,怎么找到前 1000 个最大的,堆排序?怎么构造,怎么调整,时间复杂度
  18. 十亿个数的集合和 10w 个数的集合,如何求它们的交集
  19. 给定一个文本 有 5000 万行数据,给 20 个线程,怎么利用这 20 个线程,将这些数据同步到数据库中?(生产者与消费者模型)
  20. 50 个红球,50 个篮球,有两个箱子,怎么将这 100 个球放入箱子,让另一个人随机选取箱子并选取其中一个球,是红球的概率最大
  21. 字符串有 20G 内存存不下,怎么办?
  22. 字符串有 1PB,硬盘都装不下,怎么办?
  23. 一个 3 升的桶和一个 5 升的桶,怎么得到 4 升的水
  24. 1 亿个手机号码,判断重复
  25. 10G 的文件里面的数字排序?
  26. 16 瓶正常水, 1 瓶毒水,小白鼠喝下毒水后一小时死亡,只给一小时时间,最少用多少只小白鼠可以检测出 14 瓶正常水
  27. 两根质地不均匀但是燃烧时间与绳子长度无关的一样的绳子,燃烧完一根绳子耗时一个小时,只能用这两根绳子,如何准确烧出 15 分钟?