Java基础
基础
==和equals的区别
我们重写equals,为什么还要重写hashCode<br>
集合
HashMap
HashMap的底层原理
HashMap中的put是怎么实现的
HashMap什么时候需要扩容,resize()又是怎么扩容的
HashMap中的get是怎么实现的
HashMap是线程安全的吗
HashMap扩容为什么要是二的N次方
ArratList
LinkedList
Spring
Spring IoC的理解和使用<br>
Bean是怎么创建的
Sping注入Bean的方式有哪些
Bean的生命周期
说说Spring的模块有哪些<br>
Spring一级缓存、二级缓存、三级缓存的作用
Spring是怎么解决循环依赖的,什么情况下解决不了循环依赖
Spring AOP的理解和使用
Spring AOP是在DI之前还是DI之后
Spring中声明式事务注解中的参数<br>
rollbackFor
事务传播机制
Spring中事务失效的场景<br>
Spring MVC的执行流程
Spring的Bean是线程安全的吗
并发
创建线程的方式和区别
线程的生命周期和几种状态<br>
死锁的基本条件
互斥
持有且等待
不可剥夺
循环等待
说说线程的启动和停止
什么是线程安全问题
Synchronized
Synchronized用在静态方法和用在非静态方法有什么区别<br>
说说Synchronized的原理、这个对象锁是什么
Synchronized和Lock的区别
锁状态和锁升级<br>
ThreadLocal
ThreadLocal的作用和原理
ThreadLocalMap的key是什么引用,为什么
为什么ThreadLocal用完的时候要调用remove()
BIO、NIO和AIO有什么区别<br>
说一下Java内存空间的理解
谈谈volatile的作用
谈谈你对AQS的理解
通过名称来解释:抽象、同步、队列
说一下ReentrantLock的原理<br>
ReentrantLock、CountDownLatch 、Cyclicbarrier和Semaphore区别(分别写出demo)<br>
ConcurrentHashMap<br>
线程池
JDK提供了多少种创建线程池的方式
分别说一下线程池的参数
为什么要自定义线程池
线程池的执行流程,它是怎么复用线程的
你知道JDK线程池和Tomcat线程池的区别吗
JVM
类加载过程
装载
将字节码文件转换为二进制字节流,将这个流的静态数据结构转换为方法区的数据结构,在生成一个类对象作为这个方法区的入口
链接
准备
给这个类的静态成员变量分配内存,并初始化默认值
类对象的生命周期
装载
将我们的字节码文件转换为二进制的字节流,将这个流的静态数据结构转换为方法去的数据结构,并生成一个类对象作为方法区的访问接口
链接
准备
为这个类的静态成员变量分配空间并初始化默认值
卸载
卸载需要满足三个条件
所有的实例对象被GC
加载这个类的类加载器被GC
类文件不在被引用
双亲委派机制
怎么理解双亲委派机制
双亲委派机制就是类加载器要加载类的时候,自己先不去加载,先丢给父类加载器去加载,父类加载不了才自己加载。以此类推。
怎么打破双亲委派机制
自定义一个类加载器,继承ClassLoader抽象类,重写loadClass()和findClass()<br>
JVM运行时数据区
怎么理解JVM内部结构
方法区(元空间、非堆)
线程共享区域,里面存放的是静态成员变量,常量和字节码文件装载后的数据结构等<br>
堆
也是线程共享区域,一般存放我们的对象
内部机构
又分为old区,young区。young区里面又有Eden区、S0区和S1区他这样设计是为了减少内存空间碎片
虚拟机栈
它是线程私有的,线程的方法又叫栈帧,每执行一个方法就会进栈,然后压栈。它们会按照先进后出的数据结构存储。<br>每一个栈帧里面又有局部变量表,操作数栈,动态链接和方法返回地址。<br>
程序计数器
他的作用是当线程在上下文切换的时候指针指向的位置<br>
对象是不是垃圾<br>
怎么判断一个对象是不是垃圾
引用计数
当一个对象被引用时,就不会被回收。这会有个问题,当两个对象循环引用时,就会导致内存溢出
可达性分析
别GC Root可达的对象都不是垃圾。像类加载器、静态成员变量、常量、局部变量表和Thread都是GC Root<br>
当一个对象被标为垃圾,那他一定会被回收吗
不一定,如果这个类继承了Finalize,它就有一次免死的机会
当一个对象可达时,他一定不会被回收吗<br>
不一定,如果这个对象是弱引用、软引用或者虚引用都会被回收
说说你知道的垃圾回收算法
标记清除算法
复制算法
标记整理
分代收集算法
怎么理解GC<br>
GC就是指当堆内存不足时就会触发GC,每次GC都会STW,所以尽量能避免GC就避免GC<br>
JVM常用命令
jinfo<br>
查看JVM参数和动态修改JVM参数的命令(manageable)<br>
jstat<br>
查看JVM内存中所有堆和非堆使用情况<br>
讲讲JVM调优思路
使用JVM常用命令去打印GC日志,堆信息情况和栈信息情况<br>
在分析日志
修改代码或者调整参数然后在观察
MySQL
一条查询语句的执行流程
一条更新语句的执行流程
说下你对三大日志的理解
redolog
两阶段提交,有防止宕机丢失数据的作用
为什么redolog和binlog要进行两阶段提交呢?如果先直接纪录redolog,再写binlog会怎么样
MyISAM和InnoDB的区别
是否支持事务
查询效率
修改效率
MySQL索引用B+树有什么优势?为什么?
为什么用B+树,为什么不用红黑树
说一下你对MySQL索引的理解
聚集索引
非聚集索引
主键索引
普通索引
唯一索引
大文本索引
复合索引
索引创建应该注意哪些点 ?为什么?
最左匹配原则
能用复合索引替换普通索引就不用普通索引
索引列离散度不能太低
不是建越多索引越好
主键索引列的值最好是递增式的
大字段列最好不建立索引
什么是覆盖索引,什么是索引下推?
覆盖索引就是通过索引查找数据,不需要回表就能查出数据就叫覆盖索引
索引下推就是在复合索引中,只有当多个条件都满足才会回表,这就叫索引下推。索引下推是为了减少回表次数来增加效率
索引失效有哪些场景?为什么?
不符合最左匹配原则
%在左边
索引列的离散度太低
索引列直接计算
索引列使用函数
使用了or
not in、not exists
说说MySQL的锁
共享锁(读锁)
排他锁(写锁)
意向共享锁
意向排它锁
乐观锁
悲观锁
为什么MySQL的RR可解决幻读的问题
MySQL底层用到了MVCC,MVCC就是每个select都出产生一个ReadView版本,ReadView基于高水位和低水位来判断,从而解决了幻读问题
MVCC为什么可以做到可重复读
他每个select都会产生一个版本ReadView,依据ReadView的高水位、低水位来判断<br>
说说你对InnoDB事务的理解,事务并发带来什么问题?怎么解决?
InnDB事务是基于三大日志来实现的,undolog纪录回滚日志,redolog做XA两阶段提交,binlog纪录更新语句
带来脏读、幻读、不可重复读的问题
脏读:使用读已提交隔离级别<br>不可重复读:使用可重复读隔离级别<br>幻读:基于MVCC版本的方式处理<br>
谈谈你对MySQL优化的理解
操作系统和硬件层面:服务端部署在合适的操作系统,和更好的硬件上有注意效率的提升
MySQL配置层面:长连接时间,连接数,也有可能是服务器太长时间没重启了,重启一下
架构层面:数据量太大可考虑分库分表
表结构层面:存储引擎、表结构、字段类型、索引等
Redis
什么是Redis
Redis是属于NoSQL的一种数据库,它是基于内存存储的。它有速度快、支持多种数据类型、支持多种语言、持久化、淘汰机制、集群等的特性<br>
为什么Redis的速度快
基于内存,相比于关系型数据库基于磁盘读写,基于内存会快很多
单线程,单线程就减少了CPU上下文切换所造成的开销。还有就是本身它的数据类型底层做了很多优化,比如以空间换时间
同步非阻塞IO<br>
使用多路复用的IO模型
说一说你用到的数据类型
字符串(String)
哈希(Hash)
列表(List)
集合(Set)
有序集合(ZSet)
说一说淘汰机制
volatile+lru<br>
针对一段时间最少使用的key淘汰
allkeys+lru
volatile+lfu
针对最不常用的key淘汰
allkeys+lfu<br>
allkeys+random<br>
ttl
根据ttl的设计,将一些快要过期的key淘汰<br>
说一说持久化
AOF
纪录操作语句
有每条、每秒、根据操作系统决定等策略
分布式锁的原理
说一说他的集群
MQ
为什么要用MQ,MQ解决了什么问题
异步,减少系统响应时间
解耦,使各个子系统只依赖MQ,减少系统间强依赖<br>
削峰,并发量上来服务器扛不住,可用MQ匀速处理
引用MQ会出现什么问题<br>
重复消费问题,本来只加一次钱,结果加了几次钱
数据一致性问题,消费失败等
消息丢失问题
消息顺序问题<br>
如何解决这些问题
重复消费,给消息做幂等性处理,比如设置唯一值
数据一致性,补偿机制
消息丢失,设置消息回调机制,如果一段时间没有回调重新发送
消息顺序,在代码层做处理,如果不是指定步骤就等待
Kafka
RocketMQ
ActiveMQ
RabbitMQ<br>