总觉得自己好像什么都会点,但是面试就被问得很懵逼,自己很菜就不再吐槽了
最近疯狂的在牛客刷面经,但是过目就忘了!!!所以分门别类的记录了一下高频的考点。
何为高频的考点?快速扫描了七八十篇面经后,再看的面经绝大部分都在我笔记覆盖了!
所以看完了100多篇就没怎么看了,还是整理整理开始狂补基础知识吧!
本文内容来自陌陌、美团、阿里、链家、快手、京东、瓜子、滴滴、百度、爱奇艺、vivo等十多个公司最近三年的100多篇面经中比较高频的总结,有的是校招的有的是实习的,不过不影响学习。学习嘛,反正都得学。
一、JVM
-
JVM内存结构
-
JVM的分区(Java的内存管理机制)(JAVA 的运行时区域分配):都说的是JVM的内存结构
-
JVM哪个区域不会发生内存溢出
-
-
类加载器
-
JVM 类加载机制
-
class 文件如何执行
-
为什么要引入双亲委派机制
-
什么情况下用自定义类加载器
-
-
反射
-
写一段反射的代码
-
-
GC
-
哪些阶段会发生STW现象
-
G1垃圾回收为什么可停顿
-
GC的工作流程
-
FULL GC发生场景
-
如何打印GC日志
-
经常FULL GC怎么定位到错误
-
GC可达性分析怎么做,哪些可以作为GC Root
-
CMS收集器和G1垃圾回收器回收垃圾过程
-
G1的优点
-
垃圾回收的过程,什么对象会进入老年代
-
垃圾回收算法有哪些?为什么新生代使用复制算法
-
高吞吐量时用哪种GC算法、
-
执行了System.gc()触发GC机制后如何进行回收的
-
-
其他
-
JVM排错方式
-
内存泄露的原因,举例说明
-
如何排查内存泄露
-
JVM启动参数有哪些,列举熟悉的几个
-
JVM为什么分新生代和老年代
-
系统周期性卡顿,如何定位问题,结合GC日志
-
在 JVM上运行一段Java 程序输出一条语句,它是怎么输出到屏幕上的
-
二、 并发
-
锁
-
Java 中的锁机制
-
为什么需要锁
-
介绍下几种锁
-
公平锁和非公平锁的区别
-
悲观锁和乐观锁
-
可重入锁与非可重入锁
-
自旋锁与阻塞锁
-
-
Synchronized
-
Synchronized和ReetrantLock的区别
-
Synchronized的偏向锁、轻量级锁、重量级锁
-
Synchronized关键字的底层原理
-
-
Reentrantlock
-
Reentrantlock 有哪些方法
-
有Synchronized了为什么还需要Reentrantlock
-
tryLock()在什么场景下用
-
-
读锁插队策略,锁升降级策略
-
如何优化锁并提高并发性能
-
-
线程池
-
线程池是如何实现的
-
使用线程池带来的好处
-
常见的线程池有哪些,各个参数的意义
-
执行线程池的两种方式
-
线程池怎么定时完成一项任务?
-
线程池线程都有任务,阻塞队列也满了,再来任务怎么办?
-
Java 线程池 ThreadPoolExecuter 和四个自带的线程池分别适合什么场景?
-
ScheduledThreadPoolExecutor 中的使用的是什么队列?内部如何实现任务排序
-
线程池常见的拒绝策略
-
如何优雅的关闭线程池
-
如何设计一个简单的线程池
-
-
并发类
-
怎么实现一个类满足插入和删除操作的原子性
-
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 算法计算得到的么?
-
-
-
线程
-
进程和线程的区别
-
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之后所有的线程都会再次抢夺锁,如果某线程抢夺失败怎么办?
-
守护线程和普通线程的区别?我们是否需要给线程设置守护线程?
-
什么是多线程的上下文切换
-
为什么多线程会带来性能问题?
-
单例模式的作用和适用场景
-
分布式集群中如何保证线程安全?
-
-
volatile
-
volatile有什么作用,什么时候发生指令重排
-
什么时候适合用vilatile
-
volatile 关键字的底层实现, volatile 是不是原子性的
-
-
Java内存模型
-
Java内存模型和JVM内存结构有什么不同
-
什么是Java内存模型,为什么会出现Java内存模型
-
i++是线程安全的么,从 Java 内存模型来分析,如何保证它是安全的
-
什么是原子性问题,Java中有哪些原子操作
-
new一个对象的过程是否是原子的
-
什么是可见性问题,为什么会出现,又如何解决
-
什么是重排序(有序性问题),重排序有什么意义
-
列举几条happens-before规则
-
三、 Java基础
-
数据类型
-
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 类型能否存储一个中文字符?
-
-
设计模式
-
单例模式
-
手写你认为最好的单例模式(枚举生产环境最佳,面试双重检查最优逼格,静态内部类也比较优)
-
饿汉式和懒汉式的区别和各自的优缺点
-
-
解释几个常用的设计模型,从项目出发
-
-
Java基本概念
-
重写和重载区别
-
JDK、JRE和JVM的区别和联系
-
Java中小数是怎么存的
-
static 方法和实例方法的区别
-
Java 中的 error 和 exception的区别,Java 异常体系
-
抽象类和接口的区别
-
Java 接口能定义方法体吗(1.7和1.8比较)
-
抽象类中可以有实现方法吗,它和普通方法的区别
-
不可变类和不可变对象
-
final的三种用法
-
什么时候用抽象类,什么时候用接口
-
Java Object 类中常用方法
-
==和 equals 和 hashcode()的区别
-
enum 构造方法是公共还是私有的?
-
强引用、软引用、弱引用、幻象引用有什么区别?
-
-
集合类
-
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的区别(两个有序)
-
-
maven 遇到版本不匹配的问题怎么解决
-
序列化和反序列化怎么实现,自己设计会怎么做
-
对 Java7、 8 的新特性有什么了解
-
BIO、NIO、AIO 的区别和联系
-
main 方法声明成 private 可以通过编译嘛?
-
对称加密和非对称加密
-
REASTful API 的规范,REASTful是实现机制,keepalive作用
-
lombok 底层实现怎么实现注解?
-
对象头中有哪些信息
-
什么是 rpc 框架?和 http 调用的区别是什么?
-
kafka如何保证数据可靠性
四、 数据库
-
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查询缓存在什么时候触发?什么时候失效
-
-
Redis
-
Redis有哪些数据结构
-
Redis的应用场景,过期策略
-
Redis 集群设计方案
-
Redis的持久化机制,应用场景
-
Redis为什么那么快
-
为什么使用 redis 做消息队列
-
Redis缓存穿透,缓存雪崩,以及如何解决
-
Redis有序集合的底层数据结构,为什么用跳表 压缩列表比纯用跳表好
-
AOF重写实现原理
-
Redis分布式锁的加锁解锁详细实现
-
分布式锁和锁区别,什么时候用,怎么考虑的
-
Redis 的内存淘汰策略 LRU
-
-
数据库
-
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 两个用户同时插入两条相同的数据,如何保证表里面只有一条
-
五、网络
-
三次握手四次挥手
-
三次握手的原因、每次握手的数据包
-
四次挥手的原因,每次挥手的数据包
-
两次握手行不行啊
-
首次握手的隐患-SYN超时
-
三次握手要是服务端的服务没开TCP协议栈怎么处理
-
关闭连接时TIME_WAIT的作用
-
挥手时最后一次ACK如果客户端没收到怎么办
-
-
HTTP
-
HTTP1.0和1.1的区别
-
HTTP请求的方法有哪些
-
Get和Post请求的区别
-
HTTP常用状态码
-
对 HTTPS有什么了解
-
HTTP和HTTPS的区别
-
-
TCP/UDP
-
TCP和UDP的区别
-
TCP和UDP包的区别
-
UDP如何实现可靠传输
-
TCP和HTTP的区别
-
TCP协议-如何保证传输可靠性
-
-
综合应用
-
一个网站请求从客户端到服务器端的过程
-
一个网页从输入 URL 到服务器接收到请求所经历的过程?
-
-
五层网络协议和 OSI七层网络协议
-
各层的主要功能是什么
-
TCP 协议在哪一层? IP 协议在那一层? HTTP 在哪一层?
-
-
DNS 寻址过程
-
ARP原理
-
长连接和短连接
六、 框架
-
Spring
-
Spring框架的启动流程
-
IOC和AOP的实现原理
-
写一个简易的IOC和AOP
-
Spring的优点有哪些
-
Spring Bean都是单例的吗
-
Spring Bean的生命周期
-
Spring Bean的作用域
-
Spring Bean 什么时候用原型模式
-
Spring如何解决循环依赖,解决哪一种循环依赖
-
cglib 和 jdk 的动态代理的实现原理?这两者之间性能的区别?
-
动态代理用多了之后对内存方面有什么影响嘛?
-
Spring的事务隔离级别
-
Spring的事务的传播行为
-
-
SpringMVC
-
SpringMVC 工作流程
-
SpringMVC请求URL的步骤,如果请求图片有什么不同
-
SpringMVC的Controller是线程安全的吗
-
@Autowired 的实现原理
-
@Controller,@Service,@Repository,@Componen注解的区别
-
@Resource、@Qualifier和@Autowired区别注解的区别
-
SpringMVC的 dispatcherservlet 的分派原理
-
-
Spring Boot的优点,Spring、 SpringMVC、 SpringBoot 的区别
-
Web基础
-
servlet的生命周期
-
过滤器的生命周期
-
Jsp九大内置对象
-
Jsp的四个域对象
-
Session和Cookie的区别
-
MVC设计思想
-
-
MyBatis
-
MyBatis与Hibernate的区别
-
MyBatis的核心组件有哪些?
-
DAO接口中的方法可以重载吗(重点)
-
MyBatis的动态SQL
-
MyBatis的一二级缓存
-
MyBatis的# $区别的区别
-
MyBatis的接口绑定以及实现方式
-
七、 场景题(这个纯属不会,全部面向Google学习下)
-
字符串数目从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 分钟?
内容暂时就这么多,许多内容我博客还是有,就是写博客还记得写完了渐进式遗忘
等我吃透了会再总结下这些问题的答案思路再发出来
有用就点个赞吧!