本文内容来自陌陌、美团、阿里、链家、快手、京东、瓜子、滴滴、百度、爱奇艺、vivo等十多个公司最近三年的100多篇面经中比较高频的总结,有的是校招的有的是实习的,不过不影响学习。学习嘛,反正都得学。
一、JVM
1. JVM内存结构
- JVM的分区(Java的内存管理机制)(JAVA 的运行时区域分配):都说的是JVM的内存结构
-
2. 类加载器
JVM 类加载机制
- class 文件如何执行
- 为什么要引入双亲委派机制
-
3. 反射
-
4. GC
哪些阶段会发生STW现象
- G1垃圾回收为什么可停顿
- GC的工作流程
- FULL GC发生场景
- 如何打印GC日志
- 经常FULL GC怎么定位到错误
- GC可达性分析怎么做,哪些可以作为GC Root
- CMS收集器和G1垃圾回收器回收垃圾过程
- G1的优点
- 垃圾回收的过程,什么对象会进入老年代
- 垃圾回收算法有哪些?为什么新生代使用复制算法
- 高吞吐量时用哪种GC算法、
-
5. 其他
JVM排错方式
- 内存泄露的原因,举例说明
- 如何排查内存泄露
- JVM启动参数有哪些,列举熟悉的几个
- JVM为什么分新生代和老年代
- 系统周期性卡顿,如何定位问题,结合GC日志
在 JVM上运行一段Java 程序输出一条语句,它是怎么输出到屏幕上的
二、 并发
1. 锁
Java 中的锁机制
- 为什么需要锁
- 介绍下几种锁
- 公平锁和非公平锁的区别
- 悲观锁和乐观锁
- 可重入锁与非可重入锁
- 自旋锁与阻塞锁
- 公平锁和非公平锁的区别
- Synchronized
- Synchronized和ReetrantLock的区别
- Synchronized的偏向锁、轻量级锁、重量级锁
- Synchronized关键字的底层原理
- Synchronized和ReetrantLock的区别
- Reentrantlock
- Reentrantlock 有哪些方法
- 有Synchronized了为什么还需要Reentrantlock
- tryLock()在什么场景下用
- Reentrantlock 有哪些方法
- 读锁插队策略,锁升降级策略
-
2. 线程池
线程池是如何实现的
- 使用线程池带来的好处
- 常见的线程池有哪些,各个参数的意义
- 执行线程池的两种方式
- 线程池怎么定时完成一项任务?
- 线程池线程都有任务,阻塞队列也满了,再来任务怎么办?
- Java 线程池 ThreadPoolExecuter 和四个自带的线程池分别适合什么场景?
- ScheduledThreadPoolExecutor 中的使用的是什么队列?内部如何实现任务排序
- 线程池常见的拒绝策略
- 如何优雅的关闭线程池
-
3. 并发类
怎么实现一个类满足插入和删除操作的原子性
- JUC原子类的实现原理
- AQS的原理和应用场景
- CAS的底层原理和应用场景,ABA问题
- 怎么实现一个线程安全的计数器? 原子类 AtomicInteger 实现原理是什么?和你设计的计数器优劣比较? CAS 怎么实现原子操作的?
- ThreadLocal
- ThreadLocal 的应用场景
- ThreadLocal 与Thread的关系
- ThreadLocal 使用不当为什么会发生内存溢出?怎么避免
- ThreadLocal 的应用场景
- CopyOnWriteList
- CopyOnWriteArrayList 与ArrayList相比有哪些异同?
- CopyOnWriteArrayList 通过哪些手段实现了线程安全?
- 为什么 CopyOnWriteArrayList 迭代过程中,数组结构变动,不会抛出ConcurrentModificationException ?
- CopyOnWriteArrayList对批量数据进行写操作时需要怎么优化
- CopyOnWriteArrayList 与ArrayList相比有哪些异同?
- ConcurrentHashMap
- ConcurrentHashMap 和 HashMap 的相同点和不同点
- ConcurrentHashMap 通过哪些手段保证线程安全
- CAS 算法在 ConcurrentHashMap 中的应用
- ConcurrentHashMap 是如何发现当前槽点正在扩容的?
- 发现槽点正在扩容时,put 操作会怎么办?
- ConcurrentHashMap 和HashMap的扩容有什么不同?
- ConcurrentHashMap 在 Java 7 和 8 中关于线程安全的做法有啥不同?
- 为什么超过冲突超过8才将链表转为红黑树而不直接用红黑树
- ConcurrentHashMap 和 HashMap 的相同点和不同点
阻塞队列
进程和线程的区别
- 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)
- 为什么String类型要用final修饰?
- float和double的精度,底层存储方式,和decimal有什么区别
- Integer 与 int 区别(包含自动拆装箱)
- 8个基本数据类型和对应的包装类
- Atomic Integer 和 Integer 区别。 Atomic Integer 原理
-
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会把链表转为红黑树
- HashMap的底层实现结构(1.7和1.8)
- ArrayList
- Vector、ArrayList和LinkedList有哪些区别?
- ArrayList 是怎么扩容的?初始化时给定 ArrayList 的 size,数组大小一定就是给定值吗
- ArrayList 和 LinkedList 的区别?插入、删除、访问的时间复杂度?
- Arraylist 和 Linkedlist 在尾部插入一个节点,哪个更快
- Vector、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中的执行过程
-
2. Redis
Redis有哪些数据结构
- Redis的应用场景,过期策略
- Redis 集群设计方案
- Redis的持久化机制,应用场景
- Redis为什么那么快
- 为什么使用 redis 做消息队列
- Redis缓存穿透,缓存雪崩,以及如何解决
- Redis有序集合的底层数据结构,为什么用跳表 压缩列表比纯用跳表好
- AOF重写实现原理
- Redis分布式锁的加锁解锁详细实现
- 分布式锁和锁区别,什么时候用,怎么考虑的
-
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的作用
-
2. HTTP
HTTP1.0和1.1的区别
- HTTP请求的方法有哪些
- Get和Post请求的区别
- HTTP常用状态码
- 对 HTTPS有什么了解
-
3. TCP/UDP
TCP和UDP的区别
- TCP和UDP包的区别
- UDP如何实现可靠传输
- TCP和HTTP的区别
-
4. 综合应用
一个网站请求从客户端到服务器端的过程
-
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的事务隔离级别
-
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的区别
-
5. MyBatis
MyBatis与Hibernate的区别
- MyBatis的核心组件有哪些?
- DAO接口中的方法可以重载吗(重点)
- MyBatis的动态SQL
- MyBatis的一二级缓存
- MyBatis的# $区别的区别
- MyBatis的接口绑定以及实现方式
七、 场景题(开拓思维)
- 字符串数目从0开始,一直往后递增,字符串大小不需要考虑,只是字符串的数量不断增加,在高并发的情况下,QPS十几万时,怎么生成这个确定的唯一id,还可以保证下次查询时高效率的查到
- 对于一个 10 亿的数据,如何统计里面重复数前 10 多的单词?
- 场景设计,商品表,一共 100 件商品,如何保障多用户购买商品时,商品数量不会出现负数,并且保证效率最高
- 利用 0 到 9, a 到 z 大小写都算上,生成一个 6 位的随机密码,怎么实现?
- 如果一个外卖配送单子要发布,现在有 200 个骑手都想要接这一单,如何保证 只有一个骑手接到单子?
- 假设从 2G 访问 meituan. com 变成了 4G 访问 meituan.com,OSI 七层模型,哪一层变了,为什么
- 一个保存字符串的超大文件,如何判断一个字符串在不在这个文件
- 如果说有一个操作需要创建一个对象,这个对象很大,需要消耗很多资源,如果说每调用一次方法就创建一个对象的话,开销太大,如果把它定义成一个静态变量,又会产生并 发问题,那么多线程并发操作的时候就需要加锁,降低效率。怎么优化才能既不用加锁又能提高并发访问的效率?
- 如果现在有 8G 内存,一个程序很大,由于还要留下一部分内存供其他程序使用,那么如何控制这个程序使其占用的内存不能超过 6G 呢?
- 对于一个容器,比如 set,你想实现自定义排序规则的话怎么做
- 数据库中一行记录大小 10K,一个表只有主键索引,可以存多少条数据
- 你有没有试过数据库一个表中最多可以插入多少数据
- 一个 6 位的密码,使用 MD5 加密,破解需要多久:说的是这样的,因为 6 位的密码排列组合有一定的种数,然后每一种通过 hash 函数去破解,需要多久
- 我有 8 件事要做,最要要同意返回处理结果,每件事要进行异步的方式去做。你怎么完成这个需求
- 我需要在项目启动时,将一些配置加载到内存中,你有什么方式能解决
- 10g 文件,只有 2g 内存,怎么查找文件中指定的字符串出现位置
- 100w 个数,怎么找到前 1000 个最大的,堆排序?怎么构造,怎么调整,时间复杂度
- 十亿个数的集合和 10w 个数的集合,如何求它们的交集
- 给定一个文本 有 5000 万行数据,给 20 个线程,怎么利用这 20 个线程,将这些数据同步到数据库中?(生产者与消费者模型)
- 50 个红球,50 个篮球,有两个箱子,怎么将这 100 个球放入箱子,让另一个人随机选取箱子并选取其中一个球,是红球的概率最大
- 字符串有 20G 内存存不下,怎么办?
- 字符串有 1PB,硬盘都装不下,怎么办?
- 一个 3 升的桶和一个 5 升的桶,怎么得到 4 升的水
- 1 亿个手机号码,判断重复
- 10G 的文件里面的数字排序?
- 16 瓶正常水, 1 瓶毒水,小白鼠喝下毒水后一小时死亡,只给一小时时间,最少用多少只小白鼠可以检测出 14 瓶正常水
- 两根质地不均匀但是燃烧时间与绳子长度无关的一样的绳子,燃烧完一根绳子耗时一个小时,只能用这两根绳子,如何准确烧出 15 分钟?