最全Java面试题
2021-01-18 10:07:35 1 举报
AI智能生成
最全Java面试题 包含各个模块,持续更新 本人最近两次跳槽都在看这套面试题 真的很有用
作者其他创作
大纲/内容
WEB
session和cookie的区别
servlet的生命周期
框架使用
Spring
Spring是什么
IOC
Bean相关
BeanFactory和ApplicationContext还有FactoryBean有什么区别?
Aware接口
Spring bean的生命周期?
默认创建的模式是什么?不想单例怎么办?
Spring 都有哪几种注入方式,什么情况下用哪种
Spring 中有多少种 IOC 容器?
IOC实现原理
IOC特点
autowired如何实现
没有无参构造函数能实例化吗?有参构造函数注入?(xml 配置)
循环依赖问题
解释下Spring中的三级缓存(三级缓存分别是什么,三级缓存有什么异同)
什么是循环依赖?
如何解决循环依赖
三个缓存四个方法
对象的迁移过程
如何检测是否籽在循环依赖?实际开发中见过循环依赖的异常吗?
多例的情况下,循环依赖问题为什么无法解决?
依赖注入
是什么
可以通过多少种方式完成依赖注入?
@Component, @Controller, @Repository,@Service 有何区别
AOP
AOP实现原理
动态代理和静态代理
特点
Spring 的 aop 有哪些实现方式
用Spring如何实现一个切面
Spring通知有哪些类型?通知执行的顺序
自己写的切面
事务
Spring如何实现数据库事务
spring 当中事物的隔离级别
Spring事务的传播属性是怎么回事?它会影响什么
Spring程序是如何启动的
掌握核心接口BeanDefinitionReader
掌握BeanFactory
spring常见注解
Spring框架中的单例Beans是线程安全的么?(了解)
Spring如何处理线程并发问题?(必会)
Spring 框架中都用到了哪些设计模式?(高薪必问)
注解 @Autowired 和 @Resource 有什么区别?
SpringMVC/Struts
SpringMVC/Struts处理请求流程
SpringBoot
SpringBoot是什么?为什么要使用它
SpringBoot的启动流程
Spring是如何加载配置文件到应用程序的
SpringBoot常用的starter有哪些
SpringBoot自动配置的原理
SpringBoot 的核心配置文有哪几个?它们的区别是什么?
运行SpringBoot有哪几种方式?
如何在 SpringBoot 启动的时候运行一些特定的代码?
SpringBoot支持哪些日志框架?推荐和默认的日志框架是哪个?
SpringBoot 如何定义多套不同环境配置?
SpringBoot 2.X 有什么新特性?与 1.X 有什么区别?
Hibernate
描述一下hibernate的三个状态
hibernate对一二级缓存的使用,Lazy-Load的理解
Mybatis
mybatis如何实现批量提交
mybatis如何处理结果集:反射,建议看看源码
什么是Mybatis
Mybatis的优点
与hibernate的区别
#{}和${}的区别是什么?
Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis动态SQL有什么用?执行原理?有哪些动态sql标签?
Xml映射文件中,除了select|insert|updae|delete标签之外,还有哪些标签?(了解)
MyBatis实现一对一有几种方式?具体怎么操作的?(必会)
Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?(必会)
Mybatis的一级.二级缓存(必会)
开源框架源码了解不?
微服务/分布式/集群
微服务概念
什么是微服务
微服务的优缺点
优点
缺点
在项目中遇到的坑
你所知道的微服务技术有哪些?
微服务间如何进行通讯
微服务和 SOA 的区别,优劣势
怎么理解分布式和微服务,为什么要拆分服务,会产生什么问题,怎么解决这些问题
怎么理解高可用,如何保证高可用,有什么弊端,熔断机制,怎么实现
对于高并发怎么看,怎么算高并发,你们项目有么,如果有会产生什么问题,怎么解决
微服务特点
ACID CAP BASE 理论
ACID
CAP
BASE
子主题
RPC 过程
组成
调用过程
HTTP和rpc的区别
总结
微服务拆分的原则?为啥要拆分微服务?都放在一起有什么弊端?
谈谈你对SOA和微服务的理解,以及分布式架构从应用层面涉及到的调整和挑战。
服务器模型以及之间的区别
DDD
分布式和集群的区别
分布式架构与微服务的关系
微服务之间的通信
同步调用
异步调用
SpringCloud
什么是SpringCloud(必会)
SpringCloud和Dubbo有哪些区别(必会)
SpringCloud和SpringBoot之间的关系,谈谈理解
SpringCloud的基本架构设计
核心组件
Eureka
Ribbon
OpenFeign
Gateway
Zuul
Hystrix
Config
使用SpringCloud的优缺点?(必会)
服务注册中心
Eureka
Eureka和Zookeeper注册中心的区别(高新常问)
服务注册中心宕机了怎么办?
限流/降级/熔断
什么是限流
高并发时怎么限流
什么是降级
什么是熔断
什么情况会出现雪崩,以及如何应对?
从 hystrix 一路问到原理->自己如何实现->如何优化->响应流编程(reactive streams);
项目中的容错限流,降级,兜底等怎么做的?
高并发情况下,我们系统是如何支撑大量的请求的
如果服务端挂了怎么,怎么降级?多级缓存,客户端内部缓存,CDN缓存。
分布式事务
集群、负载均衡、分布式、数据一致性的区别与关系
分布式一致性协议raft,paxos 了解吗
分布式一致性协议,二段、三段、TCC,优缺点
分布式事务了解吗?
seata
是什么
核心组件
架构图
子主题
TC
TM
RM
协作模式
子主题
工作模式
AT(Auto Transaction)默认
整体机制
图
子主题
特点
TCC(Try->commit/cancel)
整体机制
图
子主题
特点
TCC
幂等性问题
是什么
为什么需要幂等性
出现场景
前端重复提交
消息重复消费
页面回退再次提交
微服务互相调用
引入幂等性对系统的影响
如何实现幂等性
前端
方案一:数据库唯一主键
redis set防重
数据库悲观锁
数据库乐观锁
业务层分布式锁
Token机制(用的多)
不过token这种方案有一定的危险性,其实就在于服务端我们到底该如何去验证令牌。
token获取,比较和删除必须保证原子性
实际应用
原因
方案
分布式session
说说你们的分布式 session 方案是啥?怎么做的?
分布式 session 的共享方案有哪些,有什么优劣势
方案二:session复制
优点
缺点
方案四:基于redis存储session方案
示意图
子主题
优点
缺点
讲讲你对 CDN 的了解,与分布式缓存和本地缓存的区别
微服务还有其他什么组件
主要问项目情况,然后根据一个项目,问如果量级扩大 1000 倍,你会怎么做?有哪些优
化措施?高性能&高可用措施?
化措施?高性能&高可用措施?
在使用微服务架构时,你面临的挑战是什么?
从单体转微服务,理解微服务的概念
学习微服务相关知识
公司有保守派的反对
维护问题
各式各样的坑
MySQL
索引
什么是数据库索引?
为什么要建索引?(优势)
劣势
索引类型
单列索引
普通索引
唯一索引
主键索引
复合索引(联合索引,组合索引)
全文索引
空间索引
基本语法
MySql索引结构
BTree索引
Hash索引
full-text索引
R-Tree索引
如何避免索引失效
1.全值匹配
2.最佳左前缀法则
如果索引了多列,要遵守最左前缀法则。指查询从索引的最左列开始,并且不跳过索引中的列
带头大哥不能死,中间兄弟不能断
符合最佳左前缀:EXPLAIN SELECT * FROM staffs WHERE NAME='July' AND age = 20 AND pos='manager'; 用上了三个索引
带头大哥死了:EXPLAIN SELECT * FROM staffs WHERE age = 20 AND pos='manager'; 一个索引都没用上
中间兄弟断了:EXPLAIN SELECT * FROM staffs WHERE NAME='July' AND pos='manager'; 只用上了第一个NAME索引
依次使用
EXPLAIN SELECT * FROM staffs WHERE NAME='July'; 能用到NAME的索引
EXPLAIN SELECT * FROM staffs WHERE NAME='July' AND age = 22; 能用到NAME和age的索引
3.不要在索引列上做任何操作(计算、函数、自动或手动的类型转换),会导致索引失效而转向全表扫描
4.存储引擎不能使用索引中范围条件右边的列
EXPLAIN SELECT * FROM staffs WHERE NAME='July' AND age >25 AND pos='manager';
三个索引,第二个是范围条件,第二个索引只用到了排序,没用到检索。且第二个之后的索引都失效了
5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*
6.mysql在使用不等于(!=或<>)时无法使用索引会导致全表扫描
EXPLAIN SELECT * FROM staffs WHERE NAME!='July'; 无法使用索引
7.is null,is not null也无法使用索引
EXPLAIN SELECT * FROM staffs WHERE NAME is null; 无法使用索引
8.like以通配符开头('%abc...')mysql索引失效会变成全表扫描
%写在左侧或两侧都写会使索引失效,写在右边不会失效,但可能不满足业务要求,查不到数据
9.字符串不加单引号索引失效
10.少用or,用它连接索引失效
总结
为什么使用B+树而不是b树或者hash
https://blog.csdn.net/youanyyou/article/details/107053823
https://www.processon.com/diagraming/6072973a5653bb5a001e5ca5
什么样的字段需要建索引,什么样的字段不需要建索引?建索引的时候一般考虑什么?
索引会不会使插入、删除作效率变低,怎么解决?
聚集索引和非聚集索引
聚集索引
非聚集索引
聚簇索引和非聚簇索引
聚簇索引
聚簇索引一定是主键吗
非聚簇索引
回表
举例
数据库索引 主键和唯一索引有什么区别
Mysql 对联合索引有优化么?会自动调整顺序么?哪个版本开始优化?
从底层解释最左匹配原则
子主题
索引下推
图
子主题
是什么
MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。
索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。
索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。
Explain性能分析
是什么
能干嘛
用法:EXPLAIN+SQL语句
关注项目
type一般来说,保证查询至少达到range级别,最好能达到ref
all:Full Table Scan,将遍历全表以找到匹配的行
index:Full Index Scan,与all的区别是,只遍历索引树,通常比all快,因为索引文件比数据文件小。index是从索引中读取,all是从硬盘中读
range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般是在where语句中出现了between、<、>、in等的查询
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,他返回所有匹配某个单独值的行,然而,他可能会找到多个符合条件的行,所以是属于查找和扫描的混合体
eq_ref:唯一性扫描索引,对于每个索引值,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量
system:表只有一行记录(等于系统表),这是const常量类型的特例,平时不会出现,可忽略不计
possible_keys
key
key_len
Extra
Using filesort
Using temporary
Using index
数据库设计
数据库表怎么设计的?数据库范式?设计的过程中需要注意什么?
第一二三范式是什么?
子主题
锁
分类
从对数据的操作角度来看
读锁(共享锁)针对同一份数据,多个读操作可以同时进行而不会相互影响
写锁(排他锁):当前写操作没有完成之前,它会阻断其它写锁和读锁
意向共享锁:当事务准备在某条记录上加S锁时,需要先在表级别加一个IS锁。
意向排他锁:当事务准备在某条记录上加X锁时,需要先在表级别加一个IX锁。
从对数据操作的粒度来看
行锁
页锁
表锁
从加锁策略上分
乐观锁
悲观锁
表锁
特点
读锁会阻塞写,不会阻塞读;写锁会把读和写都阻塞
分析方法
行锁
特点
索引失效,行锁升级为表锁
间隙锁
如何锁定一行
分析
优化建议
页锁
共享锁与非共享锁、一个事务锁住了一条数据,另一个事务能查吗?
子主题
mysql 死锁,怎么解决,如果不要求执行顺序,死锁怎么解决
子主题
死锁
是什么
怎么解决
子主题
子主题
不要求执行顺序怎么解决
数据库优化
数据库如果让你来垂直和水平拆分,谁先拆分,拆分的原则有哪些(单表数据量多大拆)
如何优化数据库性能(索引,分库分表,分页算法,升级硬盘SSD,业务优化,主从部署)
数据库分库分表需要怎样来实现?
数据库端的常用优化策略?
分库分表和读写分离如何设计
数据库性能调优如何做
SQL优化
在工作中,SQL语句的优化和注意的事项
查询优化
小表永远驱动大表
order by 关键字优化
order by子句,尽量使用Index方式排序,避免使用Filesort
尽可能在索引列上完成排序操作,遵循索引的最佳左前缀
如果不在索引列上,filesort有两种算法:单路排序和双路排序,单路后出的,要好一点
group by关键字优化
group by实质是先排序后分组,遵循索引的最佳左前缀
当无法使用索引列,增大max_length_for_sort_data和sort_buffer_size
where高于having,能写在where限定的条件就不要取having限定了
show profile
慢查询
性能下降SQL慢,执行时间长,等待时间长原因
SQL 慢查询的优化方案,索引和表的优化方案。
如何定位一个慢查询,一个服务有多条SQL你怎么快速定位
慢查询日志优化
日志分析工具
具体方案
主从复制
mysql同步机制原理,有哪几种同步方法
原理
出现的问题
同步方式
全同步复制
半同步复制
数据库的备份和恢复怎么实现的
mysqldump备份和恢复
MySQL增量备份与恢复
MyCat分库分表
产生主从延迟的原因
mysql主从复制,主从延时怎么解决
为什么要分库分表
分库解决了什么问题
分表解决了什么问题
读写分离
分库
水平拆分
垂直拆分
分表
分区(单表数据大于500万)
实例
描述
测试
结论
range范围分区
list列表分区:
hash分区:
key分区
复合分区:
数据库事务
事务及ACID属性,MySQL事务是什么?
并发事务处理带来的问题
更新丢失
脏读
不可重复读
幻读
隔离级别
子主题
MySQL四大特性?四大隔离级别?每个隔离级别是如何解决
MVCC
是什么
核心
Undo Log
trx_id:只要有任意一个事务对某条聚簇索引记录进行修改,该事务id就会被记录到该字段里面。
roll_pointer:当任意一个聚簇索引记录被修改,上一个版本的数据记录就会被写入Undo Log日志里面。那么这个roll_pointer就是存储了一个指针,这个指针是一个地址,指向这个聚簇索引的上一个版本的记录位置,通过这个指针就可以获得到每一个历史版本的记录。
Read View
如何实现提交读
如何实现可重复读
总结
默认隔离级别为:可重复读
数据库引擎
InnoDB和Myisam的特点
子主题
B-Tree索引,myisam和innodb中索引的区别
mysql 用的什么存储引擎,这个存储引擎用的什么数据结构 ,有哪些优缺点,怎么使用,为什么默认使用InnoDB
查看方式:show engines;
Innodb的结构了解么,磁盘页和缓存区是怎么配合,以及查找的,缓冲区和磁盘数据不一致怎么办,mysql突然宕机了会出现数据丢失么
子主题
基本信息
数据文件
位置
frm文件:存放表结构
myd文件:存放表数据
myi:存放表索引
如何配置
CHAR 和 VARCHAR 的区别?
会自己生成主键为什么还要自定义主键,自动生成的主键有什么问题
自增主键的优缺点
优点
缺点
自定义主键的优缺点
优点
缺点
谈谈你对 SQL 注入式攻击的理解?
MySQL 与 MongoDB 的区别,海量数据的存储
sql的执行流程
图
子主题
文字描述
1.打开客户端后,需要和sql服务器建立连接,账号认证和校验权限
2.认证后,客户端发送查询sql脚本给服务器
3.服务器先检查查询缓存,如果缓存命中,立即返回缓存中的结果,否则进入下一阶段
4.服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划
5.MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询
6.将查询结果返回给客户端
实例
select * from table t where size > 10 group by size order by size的sql语句执行顺序?
一个表一千个列值为 true 和 false,写 sql 查询 有 300 个列值为 true 的行。
如何从一张表中查出name字段不包含“XYZ”的所有行?
如何向表里添加10000W数据
创建函数
创建存储过程
调用存储过程
limit 1000000 加载很慢的话,你是怎么解决的呢?
方案一:如果 id 是连续的,可以这样,返回上次查询的最大记录(偏移量),再往下 limit
select id,name from employee where id>1000000 limit 10.
select id,name from employee where id>1000000 limit 10.
方案二:在业务允许的情况下限制页数:
建议跟业务讨论,有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。
建议跟业务讨论,有没有必要查这么后的分页啦。因为绝大多数用户都不会往后翻太多页。
方案三:order by + 索引(id 为索引)
select id,name from employee order by id limit 1000000,10
select id,name from employee order by id limit 1000000,10
方案四:利用延迟关联或者子查询优化超多分页场景。(先快速定位需要获取的 id 段,然后
再关联)
SELECT a.* FROM employee a, (select id from employee where 条件 LIMIT 1000000,10 ) b
where a.id=b.id
再关联)
SELECT a.* FROM employee a, (select id from employee where 条件 LIMIT 1000000,10 ) b
where a.id=b.id
百万级别或以上的数据如何删除
常见join查询
sql执行顺序
七种join
left join
right join
inner join(交集)
左差集
右差集
全集
差集
日志
MySQL有哪些日志,分别有什么作用
重写日志(redo log)
回滚日志(undo log)
二进制日志(bin log)
错误日志(error log)
慢查询日志(slow query log)
工具
子主题
一般查询日志(general log)
Redis(NoSQL)/缓存
Redis基本概念
Redis 的数据结构,实际引用场景,底层实现
RedisObject
子主题
子主题
底层存储对象
子主题
子主题
底层思维
子主题
String
底层实现
三大编码格式
int
embstr
字符串在c语言中是如何存储的
子主题
这样的存储方式,在每次取值的时候都需要遍历整个数组,时间复杂度为O(n)
字符串在redis中是怎么存储的
子主题
redis为什么要重新设计embstr数据类型
子主题
embstr和raw的区别
子主题
空间预分配
优点
子主题
原则
子主题
raw
Hash
场景
底层实现
ziplist
长相
子主题
为什么使用ziplist不使用双向链表
节点构成
子主题
hashtable
List
场景
底层实现
quicklist
子主题
Set
场景
子主题
子主题
子主题
子主题
场景
子主题
底层结构
intset
hashtable
zset
场景
根据商品销售对商品进行排序显示
子主题
抖音热搜
子主题
底层结构
ziplist
skiplist
为什么使用跳表
普通链表
子主题
跳表
子主题
时间复杂度
O(logN)
子主题
空间复杂度
O(N)
子主题
插入和删除的时间复杂度
优缺点
子主题
为什么使用跳表不使用红黑树
新插入一个节点的流程。
子主题
bitmap(位图,实质是sring)
亿级系统中常见的统计
是什么
子主题
能干嘛
子主题
案例
需求
子主题
小厂方法,使用MySQL
痛点
子主题
大厂方法,使用bitmap
说明
子主题
常见命令
setbit
setbit key offset value
子主题
setbit 键 偏移位 只能零或者1
Bitmap的偏移量是从零开始算的
getbit
getbit key offset
setbit和getbit案例说明
子主题
子主题
bitmap的底层编码说明,get命令操作如何
实质是二进制的ascii编码对应
redis里用type命令看看bitmap实质是什么类型???
man ascii
子主题
设置命令
子主题
strlen
子主题
bitcount
bitop
子主题
怎么统计一亿用户的日活,hyperloglog有什么缺点,bitmap不行么
HypLogLog(统计,实质是sring)
常见术语
UV
Unique Visitor,独立访客,一般理解为客户端IP
需要去重考虑
PV
Page View,页面浏览量
不用去重
DAU
日活跃用户量
登录或者使用了某个产品的用户数(去重复登录的用户)
常用于反映网站、互联网应用或者网络游戏的运营情况
MAU
MonthIy Active User 月活跃用户量
是什么
去重复统计功能的基数估计算法-就是HyperLogLog
子主题
基数
是一种数据集,去重复后的真实个数
子主题
基数统计
用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
一句话
去重脱水后的真实数据
该数据类型如何演化而来
传统方式
HashSet
bitmap
子主题
概率算法
子主题
原理说明
只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体内容。
有误差
非精确统计
牺牲准确率来换取空间,误差仅仅只是0.81%左右
误差怎么来的
http://antirez.com/news/75
Redis之父安蒂雷斯回答
子主题
经典面试题
为什么redis集群的最大槽数是16384个?
子主题
子主题
子主题
基本命令
子主题
GEO(地里,实质是zset)
简介
子主题
原理
子主题
命令
子主题
底层是Zset
Stream
一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他
们最多能存放多少元素?
们最多能存放多少元素?
Redis 是基于内存的么
项目中有(扩容,失效 key 清理策略等)
Redis是单线程还是多线程
3.x版本
这个时候使用的是单线程,但是并不是整个Redis实例是单线程,而是网络IO和键值读写是由一个线程完成的,其他比如:持久化 异步删除 集群数据同步等是由其他线程执行的
总结:工作线程是单线程 但是 整个Redis来说是多线程的
总结:工作线程是单线程 但是 整个Redis来说是多线程的
单线程依旧很快的原因
4.x和6.x版本
为什么引入了多线程
注意:80%的公司使用单线程就已经足够了
zset
zset延时队列如何实现
.redis字典结构,hash冲突怎么办,rehash,负载因子
Redis为什么快?高性能设计之epoll和IO多路复用深度解析
redis 单机能抗多少qps?
redis集群
了解 redis 集群么,如何做高可用,集群
集群常见问题
复制原理
Redis 的同步机制了解么?
Redis 集群最大节点个数是多少?
redis集群,为什么是16384
选举过程
脑裂问题
是什么
出现场景
场景一
场景二
如何解决
如何解决缓存单机热点问题
Redis持久化
Redis 的持久化?有什么区别,有什么优缺点
如何保证数据不丢失
Redis锁
为什么要使用Redis锁
Redis做分布式锁的时候需要注意的问题
如果是Redis是单点部署的,会带来什么问题?怎么解决
集群模式下,比如主从模式,有没有什么问题呢?
那你简单的介绍一下Redlock吧?你简历上写redisson,你谈谈
Redis分布式锁如何续期?看门狗知道吗?
是什么
子主题
关键点
子主题
注意
子主题
Redis 分布式锁是如何实现的?
redis的淘汰策略有哪些
生产上你们的redis内存设置多少
如何配置、修改redis内存大小
如果内存满了你怎么办?内存满了怎么办
如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中被被删除呢??
redis清理内存的方式?定期删除和惰性删除了解过吗
redis缓存淘汰策略
redis的LRU了解过吗?可否手写一个LRU算法
是什么
设计思想
手写LRU
依赖JDK
不依赖JDK
列举一个常用的Redis客户端的并发模型
缓存问题
缓存雪崩
缓存穿透
是什么
危害
解决方案
方案1:空对象缓存或者缺省值
子主题
但是
方案2:Google布隆过滤器Guava解决缓存穿透
说明
子主题
缺点
子主题
方案3:Redis中的布隆过滤器
在系统中使用的流程
子主题
子主题
缓存击穿
是什么
危害
解决方案
方案一
子主题
子主题
方案二
方案2:对于访问频繁的热点key,干脆就不设置过期时间
方案三
方案3:互斥独占锁防止击穿
子主题
案例
布隆过滤器
常见面试题
现有50亿个电话号码,现有10万个电话号码,
如何要快速准确的判断这些电话号码是否已经存在?
如何要快速准确的判断这些电话号码是否已经存在?
子主题
是什么
由一个初值都为零的bit数组和多个哈希函数构成,
用来快速判断某个数据是否存在
用来快速判断某个数据是否存在
子主题
本质就是判断具体数据存不存在一个大的集合中
布隆过滤器是一种类似set的数据结构,只是统计结果不太准确
特点
高效地插入和查询,占用空间少,返回的结果是不确定性的。
一个元素如果判断结果为存在的时候元素不一定存在,
但是判断结果为不存在的时候则一定不存在。
但是判断结果为不存在的时候则一定不存在。
布隆过滤器可以添加元素,但是不能删除元素。
因为删掉元素会导致误判率增加。
因为删掉元素会导致误判率增加。
误判只会发生在过滤器没有添加过的元素,
对于添加过的元素不会发生误判。
对于添加过的元素不会发生误判。
结论
有,是可能有
无,是肯定无
使用场景
解决缓存穿透的问题
黑名单校验
原理
传统java中的hash
哈希函数的概念是:将任意大小的输入数据转换成特定大小的输出数据的函数,转换后的数据称为哈希值或哈希编码,也叫散列值
如果两个散列值是不相同的(根据同一函数)那么这两个散列值的原始输入也是不相同的。
这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。
散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,
这种情况称为“散列碰撞(collision)”。
用 hash表存储大数据量时,空间效率还是很低,当只有一个 hash 函数时,还很容易发生哈希碰撞。
哈希函数的概念是:将任意大小的输入数据转换成特定大小的输出数据的函数,转换后的数据称为哈希值或哈希编码,也叫散列值
如果两个散列值是不相同的(根据同一函数)那么这两个散列值的原始输入也是不相同的。
这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。
散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,
这种情况称为“散列碰撞(collision)”。
用 hash表存储大数据量时,空间效率还是很低,当只有一个 hash 函数时,还很容易发生哈希碰撞。
子主题
Java中hash冲突的案例
子主题
实现原理和数据结构
布隆过滤器原理
布隆过滤器(Bloom Filter) 是一种专门用来解决去重问题的高级数据结构。
实质就是一个大型位数组和几个不同的无偏hash函数(无偏表示分布均匀)。由一个初值都为零的bit数组和多个个哈希函数构成,用来快速判断某个数据是否存在。但是跟 HyperLogLog 一样,它也一样有那么一点点不精确,也存在一定的误判概率
添加key时
使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,
每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。
查询key时
只要有其中一位是零就表示这个key不存在,但如果都是1,则不一定存在对应的key。
结论:
有,是可能有
无,是肯定无
布隆过滤器(Bloom Filter) 是一种专门用来解决去重问题的高级数据结构。
实质就是一个大型位数组和几个不同的无偏hash函数(无偏表示分布均匀)。由一个初值都为零的bit数组和多个个哈希函数构成,用来快速判断某个数据是否存在。但是跟 HyperLogLog 一样,它也一样有那么一点点不精确,也存在一定的误判概率
添加key时
使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,
每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。
查询key时
只要有其中一位是零就表示这个key不存在,但如果都是1,则不一定存在对应的key。
结论:
有,是可能有
无,是肯定无
子主题
子主题
误判率问题
布隆过滤器的误判是指多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,
因此误判的根源在于相同的 bit 位被多次映射且置 1。
这种情况也造成了布隆过滤器的删除问题,因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位。
如果我们直接删除这一位的话,会影响其他的元素
特性
一个元素判断结果为没有时则一定没有,
如果判断结果为存在的时候元素不一定存在。
布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。
布隆过滤器的误判是指多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,
因此误判的根源在于相同的 bit 位被多次映射且置 1。
这种情况也造成了布隆过滤器的删除问题,因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位。
如果我们直接删除这一位的话,会影响其他的元素
特性
一个元素判断结果为没有时则一定没有,
如果判断结果为存在的时候元素不一定存在。
布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。
总结
子主题
优缺点
优点
高效地插入和查询,占用空间少
缺点
不能删除元素。
因为删掉元素会导致误判率增加,因为hash冲突同一个位置可能存的东西是多个共有的,
你删除一个元素的同时可能也把其它的删除了。
因为删掉元素会导致误判率增加,因为hash冲突同一个位置可能存的东西是多个共有的,
你删除一个元素的同时可能也把其它的删除了。
存在误判
不同的数据可能出来相同的hash值
不同的数据可能出来相同的hash值
总结
子主题
双写一致性
canal
双写一致性的更新策略
先更新数据库,再更新缓存
异常问题
子主题
先更新数据库,再删除缓存
异常问题
子主题
解决方案
子主题
先删除缓存,再更新数据库
异常问题
子主题
解决方案
延时双删策略
子主题
延时双删相关面试题
这个删除该休眠多久呢
当前演示的效果是mysql单机,如果mysql主从读写分离架构如何?
这种同步淘汰策略,吞吐量降低怎么办?
如果再来请求可以先放到缓存队列中
redis强一致性么,怎么保证强一致性,有什么方案
实际案例
微信红包
子主题
短链接推广
一个热榜功能如何设置,如何保证缓存和数据库的一致性
项目相关你用过redis,用在什么场景,怎么使用的?
redis和其他数据库的对别
memcache与redis的区别
Redis 常见性能问题和解决方案
Pipeline 有什么好处,为什么要用 pipeline?
假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的
已知的前缀开头的,如果将 它们全部找出来?
已知的前缀开头的,如果将 它们全部找出来?
使用过 Redis 做异步队列么,你是怎么用的?
内外网数据同步的时候使用list做了一个异步队列
Redis 崩溃时,如何保证数据不丢失?
消息中间件
RabbitMQ
优缺点
RabbitMQ的工作模式?
如何保证RabbitMQ高可用?
如何确保消息不被重复消费(如何保证幂等性)
如何保证消息不被重复消费
如何保证幂等性
子主题
如何保证消息的可靠性
列举一个常用的消息中间件,如果需要保序如何实现?
mq的原理是什么:有点大。。都可以说
如何确保消息正确地发送至RabbitMQ?如何确保消息接收方消费了消息?
mq如何保证实时性
mq的持久化是怎么做的;
工作图
子主题
如何解决消息队列的延时以及过期失效问题?
消息队列满了以后该怎么处理?
消息如何分发
消息怎么路由?
消息基于什么传输?
如何保证高可用的?RabbitMQ 的集群
RabbitMQ 的工作模式
为什么需要消息系统,MySQL 不能满足需求吗?
消息中间件有哪些?他们之间的优劣势?
部署运维
Linux
软连接和硬链接的区别
/etc/hosts文件有什么作用
Linux常用命令
Linux常用命令有哪些
如何快速的将一个文本中所有的“abc”替换为“xyz”
使用两种命令创建一个文件
问题排查/性能优化
如何在log日志中搜索出error的日志
发现磁盘空间不够,如何快速找出占用空间最大的文件
如何查看一个java线程的资源消耗
Load过高的可能性有哪些
java服务问题排查(OOM,CPU高,Load高,类冲突)
java常用问题排查工具及用法(top,iostat,vmstat,sar,tcpdump,jvisualvm,jmap,jconsole)
Thread dump文件如何分析(Runnable,锁,代码栈,操作系统线程ID关联)
如何查看java应用的线程信息
怎么查看系统负载
Cpu load 的参数如果为 4,描述一下现在系统处于什么情况
如何查看系统日志文件
Linux 查看 cpu 占用率高的进程
Docker
Docker 有使用过和了解吗?Docker 和 JVM 的区别是什么?
Docker 的基本架构和使用场景?
负载均衡
负载均衡有接触过哪些开源框架,优劣势是什么?
负载均衡的原理
服务器如何负载均衡,有哪些算法,哪个比较好,一致性哈希原理,怎
么避免 DDOS 攻击请求打到少数机器
源码阅读
ConCurrentHashMap
HashMap
线程池
CopyOnWriteArrayList
AtomicInteger
UnSafe
AQS
项目经验
参与的并发项目,从设计到部署,按照流程讲一遍。
如何设计单点登录,单点登录的原理
项目介绍?
项目设计优化
你觉得你能怎么优化这个项目?
如果让你来设计秒杀系统,你的设计思路是什么,为什么要这样设计?
介绍你实践的性能优化案例,以及你的优化思路
项目参与的核心设计有哪些
项目的困难挑战
遇到的最大困难是什么?怎么解决的?
谈一个你觉得你学到最多的项目,使用了什么技术,挑战在哪里
你觉得对你技术提升最高的是
哪一件事情,提升了你哪一方面的技术?
SQL调优
JVM优化
死锁
项目参与的核心设计有哪些
技术选型,一个新技术和一个稳定的旧技术,你会怎么选择,选择的考虑有哪些
最近在学什么新技术
系统设计
如何实现1亿用户的消息通知机制
一个热榜功能怎么设计,怎么设计缓存,如何保证缓存和数据库的一致性
设计一个高并发系统
非技术类面试
自我介绍
为什么选择换公司?
三年到五年的职业规划?
如果问到你的规划是什么,请记得一定告诉 HR 你想成为一名优秀的技术专家
你有想问我的?
对哪些技术比较熟悉?
说一下自己的优点
智力题:时针分针什么时候重合
你遇到什么挫折,怎么应对和处理
你遇到的最大问题或者是困难是什么
你能为公司带来什么
重要必考知识点
Spring
bean的生命周期
Springboot的启动过程
循环依赖和三级缓存
分布式微服务
幂等性
分布式事务
分布式session
多线程
cas,aqs,volitile
线程池
锁的优化
HashMap
HaspMap的底层实现?
HashMap的put操作是如何实现的
HashMap 中的 get()方法是如何实现的?
HashMap 和 ConcurrentHashMap 的 size 方法怎么实现的
HashMap的resize()方法
代码
HashMap的remove()方法
HashMap扩容为什么是2的幂
hashmap的负载因子为什么是0.75
HashMap 可以用在哪些场景?
HashMap进行增删操作之后,后端数据结构如何位移
如何实现HashMap顺序存储:可以参考LinkedHashMap的底层实现;
你知道 hash 的实现吗?为什么要这样实现?
为什么要用异或运算符?
HashMap,LinkedHashMap,TreeMap 有什么区别?
HashMap & TreeMap & LinkedHashMap 使用场景?
和ConcurrentHashMap的区别
为什么1.8从头插法改为了尾插法
头插法有什么问题,为什么线程不安全
HashMap 根据key 获取值的时间复杂度是多少:
1.8的HashMap解决了1.7中的什么问题:
HashMap线程不安全,高并发的时候用什么呢?
如何解决Hash冲突
红黑树节点添加过程
为什么分高低位
子主题
为什么在8之后转为红黑树
JVM
类的加载机制
虚拟机布局
生产环境故障排查
假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位
生产环境服务器变慢,诊断思路和性能评估
有哪些手段排查OOM
垃圾回收算法
垃圾收集器
调优参数和工具
Redis
redis锁(看门狗)
Redis底层原理
缓存淘汰策略
双写一致性
MySQL
MySQL的事务隔离级别
MVCC
mysql索引结构
Netty的原理
包括select,poll和epoll
RabbitMQ
RabbitMQ如何保证消息不丢失
秒杀系统的设计
临时记录
自己写的切面
用redis做异步队列
模板方法 AQS
幂等性
缓存双写一致性
高并发,秒杀系统,高qps查询系统的设计
分布式事务seata
分布式session的管理
微服务集群数量
redis集群数量
MySQL集群数量
最高qps
缓存预热
异步队列如何实现的
卷宗系统
虚拟机设置为 CMS 垃圾回收算法
问到的
xxl-job的底层原理
xxl-job其实也是在quartz的基础上实现的,但是修改了任务调度的模式,并且任务调度采用注册和RPC调用方式来实现
Eureka的CAP
Ribbon自己添加负载均衡,Ribbon的负载均衡模式
子主题
gateway的原理
1流量进入网关后先进入handler mapping 进行匹配具体的route ,
2再通过handler 处理route。
3处理请求的时候经过过滤器链处理一系列过滤器(包括route中的自定义filter和系统自带的全局过滤器)进请求处理,最终到达被代理的服务。
2再通过handler 处理route。
3处理请求的时候经过过滤器链处理一系列过滤器(包括route中的自定义filter和系统自带的全局过滤器)进请求处理,最终到达被代理的服务。
servlet的拦截器 过滤器
Java泛型如何运作的
服务注册中心的原理
string的equals
spring的事务失效场景
索引下推
sql的执行过程
zipkin原理
基础部分
Java 面向对象包括哪些特性,怎么理解的?
拆箱装箱的原理
1.7版本以及1.8版本的不同md5加密的原理
接口与抽象类的区别
子主题
Java中的异常有哪几类?分别怎么使用
说出5个常见的异常类
==和equals的区别
hashCode和equals
hashCode方法的作用
你重写过hashcode和equals么,要注意什么
hashcode 和 equals,为什么要同时重写 hashcode 和 equals
假设现在一个学生类,有学号和姓名,我现在 hashcode 方法重写的时候,只将学号参与计
算,会出现什么情况?
算,会出现什么情况?
java中一个字符占多少个字节,int,long,double占多少字节
创建一个类的实例都有哪些方法
java关键字
final/finally/finalize的区别
volatile
volatile关键字解决了什么问题,实现原理是什么
volatile 和 synchronized 区别
Volatile 能保证原子性吗?为什么?
如何用java分配一段连续的1G的内存空间?需要注意什么?
什么是java序列化,如何实现java序列化?写一个实例
多态的原理
java反射
动态代理的实现方式和区别(cglib和jdk动态代理的区别)
如何使用反射
讲一下一个变量从产生到结束所经历的过程,讲一下字符串常量的过程?
Integer 和 int 有啥区别,integer 中有哪些特殊的函数?
Object 类你知道的方法
强,软,弱,虚四种引用的区别
软:SoftReference实现,内存充足的时候不会被回收,不充足的时候会被回收
当一个应用需要读取大量图片的时候,就可以使用软引用,可以防止内存溢出
弱:WeakReference实现,当进行GC的时候就会被回收
WeakHashMap-->一般用于缓存使用 WeakHashMap是基于弱引用的,也就是说只要垃圾回收机制一开启,就直接开始了扫荡,看见了就清除。
强:对于强引用的对象,当进行垃圾回收的时候,就算出现了OOM,也不会对该对象进行回收(默认模式)
软:SoftReference实现,内存充足的时候不会被回收,不充足的时候会被回收
当一个应用需要读取大量图片的时候,就可以使用软引用,可以防止内存溢出
弱:WeakReference实现,当进行GC的时候就会被回收
WeakHashMap-->一般用于缓存使用 WeakHashMap是基于弱引用的,也就是说只要垃圾回收机制一开启,就直接开始了扫荡,看见了就清除。
虚:PhantomReference实现,虚引用相当于形同虚设,不能单独使用,不能访问,要和引用队列(ReferenceQueue)结合使用
数组在内存中如何分配
&,|,^,<<,>>,>>>
Java8新特性
CompletableFuture
函数式编程
接口的默认方法
Lambda表达式
讲一下 Lambda 的表达式作用域(Lambda Scopes)
函数式接口
方法和构造函数引用
stream流
JMM内存模型
是什么
和volitile的关系
三大特性
可见性
原子性
有序性
为什么要有JMM,作用和功能是什么
happens-before现行发生原则了解过吗
对象布局相关
对象的布局
对象头存储哪些信息,长度是多少
utf-8 编码中的中文占几个字节;int 型几个字节?
谈谈注解的理解
谈一谈对泛型的理解
final、finally、finallize?finally 是在 return 之前执行还是之后?
finally 块里的代码一定会执行吗?
finally 块里的代码一定会执行吗?
基本数据类型 bit 长度?
char 能不能存中文?
new Object[100]对象大小,它的一个对象引用大小,对象头结构
函数a调用函数b的过程,是怎么传参的
java里面的函数调用有哪些,io流里面有函数调用么
java是值传递还是引用传递
待整理部分
String
String/StringBuffer/StringBuilder的区别,他们的实现是什么
String s = new String("abc");创建了几个String Object
给你两个文件(字符串形式的)如何找出他们之间的不同地方?
String
String与StringBuffer可变性的分析
StringBuffer和StringBuilder线程安全的问题
String和StringBuffer的效率问题
IO
NIO
NIO模型,select/epoll的区别,多路复用的原理
IO模型
BIO(同步阻塞)
工作机制
子主题
优缺点
应用场景
NIO(同步非阻塞)
工作机制
图
子主题
图说明
文字
名词解释
缓冲区(Buffer)
子主题
通道(Channel)
子主题
选择器(Selector)
子主题
优缺点
应用场景
NIO与零拷贝
什么是零拷贝?
零拷贝实现方式
零拷贝的优点
AIO(异步非阻塞)
线程模型基本介绍
传统阻塞 I/O 服务模型
子主题
Reactor 模式
单 Reactor 单线程
子主题
单Reactor多线程
子主题
主从 Reactor 多线程
子主题
Netty
Netty中怎么解决粘包问题的?
什么是粘包和拆包
粘包
子主题
拆包
子主题
解决方式
对应定长法的解码器 FixedLengthFrameDecoder
对应明确消息边界的分隔符拆包器 DelimiterBasedFrameDecoder
对应消息头消息体的基于数据包长度的解码器 LengthFieldBasedFrameDecoder
Reactor 模式
异步模型
子主题
Netty核心组件
BootStrap和ServerBootStrap
EventLoopGroup(实现类 NioEventLoopGroup) 和EventLoop
ChannelFuture
Selector
Channel
ChannelPipeLine
ChannelHandler
ChannelHandlerContext
Unpooled
图解
子主题
select/poll/epoll
select
简单原理
优点
缺点
poll
简单原理
优点
缺点
epoll
简单原理
epoll_create
创建一个 epoll 句柄
epoll_ctl
向内核添加、修改或删除要监控的文件描述符
epoll_wait
类似发起了select() 调用
事件通知机制
LT和ET
LT
ET
结论
三个方法的对比
子主题
为什么三个方法都进行保留
集合
List
常用的集合类有哪些,比如List如何排序
ArrayList 是否会越界。
ArrayList 和 hashset 有何区别。hashset 存的数是有序的么。
ArrayList和LinkedList内部的实现大致是怎么样的?他们之间的区别和优缺点
我们知道ArrayList是线程不安全,请编码一个不安全的案例并给出解决方案
arraylist原理
ArrayList的底层是数组,动态扩容的数组,初始的时候,数组的长度为0,当添加第一个元素之后,数组的长度变为10,然后之后每次扩容是按照之前的1.5倍进行扩容
里面的数组为什么要加上transient
因为序列化的时候就不用序列化该数组了,因为一般数组的长度是要大于实际的元素的数量的
add和get时间复杂度
O(1)
扩容原理
详见原理
Set
HashSet和HashMap的区别
HashSet 的源码
往 set 里面 put 一个学生对象,然后将这个学生对象的学号改了,再 put 进去,可以放进
set 么?并讲出为什么
set 么?并讲出为什么
Map
HashMap
HaspMap的底层实现?
HashMap的put操作是如何实现的
HashMap 中的 get()方法是如何实现的?
HashMap 和 ConcurrentHashMap 的 size 方法怎么实现的
HashMap的resize()方法
代码
HashMap的remove()方法
HashMap扩容为什么是2的幂
hashmap的负载因子为什么是0.75
HashMap 可以用在哪些场景?
HashMap进行增删操作之后,后端数据结构如何位移
如何实现HashMap顺序存储:可以参考LinkedHashMap的底层实现;
你知道 hash 的实现吗?为什么要这样实现?
为什么要用异或运算符?
HashMap,LinkedHashMap,TreeMap 有什么区别?
HashMap & TreeMap & LinkedHashMap 使用场景?
和ConcurrentHashMap的区别
为什么1.8从头插法改为了尾插法
头插法有什么问题,为什么线程不安全
HashMap 根据key 获取值的时间复杂度是多少:
1.8的HashMap解决了1.7中的什么问题:
HashMap线程不安全,高并发的时候用什么呢?
如何解决Hash冲突
红黑树节点添加过程
为什么分高低位
子主题
为什么在8之后转为红黑树
ConcurrentHashMap
ConCurrentHashMap如何解决线程安全
初始化数据结构时如果保证线程安全?
底层数据结构扩容时如果保证线程安全?
get方法如何线程安全地获取key、value?
put方法如何线程安全地设置key、value?
size方法如果线程安全地获取容器容量?
说一下 ConcurrentHashMap 和 HashTable 在性能上的区别?以及这种差异形成的原因
从 ConcurrentHashMap 一路问到锁&锁优化->LongAdder->伪共享->缓存行填充->cas 等诸
多技术细节
针对 ConcurrentHashMap 锁机制具体分析(JDK 1.7 VS JDK 1.8)?
ConcurrentHashMap 在 JDK 1.8 中,为什么要使用内置锁 synchronized 来代替重入锁 ReentrantLock?
简单介绍
ConcurrentHashMap 的并发度是什么?
分段锁的好处
HashTable
如何实现一个HashTable?
和HashMap的区别
如何考虑Hash冲突
TreeMap如何插入数据:二叉树的左旋,右旋,双旋;
JUC/高并发/多线程
线程创建
如何创建线程?(几种方式)如何保证线程安全
什么情况下使用Runnable和Thread创建线程
锁
synchronized
synchronized 的实现原理?
为什么任何一个对象都能够成为一个锁
什么是可重入性,为什么synchronized是可重入的
JVM对java的原生锁做了什么优化
synchronized 锁升级 无锁,偏向锁 轻量锁 重量锁
面试题
锁的升级过程。对象头的结构和状态的变化
偏向锁
无锁-偏向锁
轻量级锁
偏向锁-轻量级锁
重量级锁
轻量级锁-重锁
自旋多少次升级为重量级锁
偏向锁可以变为无锁吗
轻量级锁可以变成偏向锁吗?
锁升级之后 hashcode 存储到哪里了
各种锁的优缺点
子主题
什么是锁消除
子主题
什么是锁粗化
子主题
理论知识
对象头中的markword
锁的升级过程:无锁 偏向锁 轻量级锁 重量级锁
用户态与核心态的切换
java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在用户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有客自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。
在Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(moni tor)是依赖于底层的操作系统的Mutex Lock(系统互斥量)来实现的,挂起线程和恢复线程都需要转入内核态去完成,阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的时间可能比用户代码执行的时间还长”,时间成本相对较高,这也是为什么早期的 synchronized效率低的原因Java6之后,为了减少获得锁和释放锁所带来的性能消着毛,引入了轻量级锁和偏向锁
在Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(moni tor)是依赖于底层的操作系统的Mutex Lock(系统互斥量)来实现的,挂起线程和恢复线程都需要转入内核态去完成,阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的时间可能比用户代码执行的时间还长”,时间成本相对较高,这也是为什么早期的 synchronized效率低的原因Java6之后,为了减少获得锁和释放锁所带来的性能消着毛,引入了轻量级锁和偏向锁
为什么要有偏向锁和轻量锁
因为获得锁和释放锁是一个很消耗性能的工作
synchronized 锁的升级变化过程
偏向锁
含义:当线程A第一次竞争到锁的时候,通过操作修改MarkWord中的偏向线程ID,锁变为偏向模式,如果不存在其他线程的竞争,那么持有偏向锁的线程将永远不需要进行同步(不需要反复的获得锁和释放锁消耗资源)
主要作用:不存在其他线程竞争的情况下,不需要反复的获得和释放锁,减少性能的消耗
场景:有且只有一个线程访问的情况
MarkedWord存储的是偏向线程的id
相关理论
理论落地:
在实际应用运行过程中发现,“锁总是同一个线程持有,很少发生竞争”,也就是说锁总是被第一个占用他的线程拥有,这个线程就是锁的偏向线程。
那么只需要在锁第一次被拥有的时候,记录下偏向线程ID。这样偏向线程就一直持有着锁(后续这个线程进入和退出这段加了同步锁的代码块时,不需要再次加锁和释放锁。而是直接会去检查锁的MarkWord里面是不是放的自己的线程ID)。
如果相等,表示偏向锁是偏向于当前线程的,就不需要再尝试获得锁了,直到竞争发生才释放锁。以后每次同步,检查锁的偏向线程 D与当前线程ID是否一致,如果一致直接进入同步。无需每次加锁解锁都去CAS更新对象头。如果自始至终使用铺的线程只有一个,很明显偏向锁几乎没有额外开销,性能极高。
如果不等,表示发生了竞争,锁已经不是总是偏向于同一个线程了,这个时候会尝试使用CAS来替换MarkWord里面的线程ID为新线程的ID,
竞争成功,表示之前的线程不存在了,MarkWord里面的线程ID为新线程的ID,锁不会升级,仍然为偏向锁:
竞争失败,这时候可能需要升级变为轻量级锁,才能保证线程问公平竞争锁。
注意,偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程是不会主动释放偏向锁的。
在实际应用运行过程中发现,“锁总是同一个线程持有,很少发生竞争”,也就是说锁总是被第一个占用他的线程拥有,这个线程就是锁的偏向线程。
那么只需要在锁第一次被拥有的时候,记录下偏向线程ID。这样偏向线程就一直持有着锁(后续这个线程进入和退出这段加了同步锁的代码块时,不需要再次加锁和释放锁。而是直接会去检查锁的MarkWord里面是不是放的自己的线程ID)。
如果相等,表示偏向锁是偏向于当前线程的,就不需要再尝试获得锁了,直到竞争发生才释放锁。以后每次同步,检查锁的偏向线程 D与当前线程ID是否一致,如果一致直接进入同步。无需每次加锁解锁都去CAS更新对象头。如果自始至终使用铺的线程只有一个,很明显偏向锁几乎没有额外开销,性能极高。
如果不等,表示发生了竞争,锁已经不是总是偏向于同一个线程了,这个时候会尝试使用CAS来替换MarkWord里面的线程ID为新线程的ID,
竞争成功,表示之前的线程不存在了,MarkWord里面的线程ID为新线程的ID,锁不会升级,仍然为偏向锁:
竞争失败,这时候可能需要升级变为轻量级锁,才能保证线程问公平竞争锁。
注意,偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程是不会主动释放偏向锁的。
偏向锁的撤销
理论:偏向锁使用一种等到竞争出现时才释放锁的机制,只有当其他线程竞争锁时,持有偏向锁的原来线程才会被撤销,撤销需要等待全局安全点(该节点上没有字节码正在执行),同时检查持有偏向锁的线程是否还在执行
分为两种情况
①第一个线程正在执行synchronized方法(处于同步块),它还没有执行完,其它线程来来抢夺,该偏向锁会被取消掉并出现锁升级。此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程会会进入自旋等待获得该轻量级锁。
②第一个线程执行完成synchronized方法(退出同步块),则将对象头设置成无锁状态关并撤销偏向锁,重新偏向。
Java15开始,正在逐步废弃偏向锁,默认不开启,可手动配置开启
轻量级锁
含义:多线程竞争,但是任一时刻最多只有一个线程竞争(也就是两个线程在竞争同一个资源)
作用:有线程来参与竞争,但是获取锁的冲突时间极短,本质就是CAS,避免线程的阻塞
场景:有两个线程来交替访问进行竞争
轻量级锁的获取
轻量级锁是为了在线程近乎交替执行同步块时提高性能。
主要目的:在没有多线程竞争的前提下,通过CAS减少重量级锁使用操作系统互斥量产生的性能消耗,说白了先自旋,不行才升级阻塞。升级时机:当关闭偏向锁功能或多线程竞争偏向锁会导致偏向锁升级为轻量级锁
假如线程A已经拿到锁,这时线程B又来抢该对象的锁,由于该对象的锁已经被线程A拿到,当前该锁已是偏向锁了。
而线程B在争抢时发现对象头MarkWord中的线程ID不是线程B自己的线程ID(而是线程A),那线程B就会进行CAS操作希望能获得锁。此时线程B操作中有两种情况:
如果锁获取成功,直接替换MarkWord中的线程ID为B自己的ID(A→B),重新偏向于其他线程(即将偏向锁交给其他线程,相当于当前线程"被"释放了锁),该锁会保持偏向锁状态,A线程Over,B线程上位;
如果锁获取失败,则偏向锁升级为轻量级锁(设置偏向锁标识为0并设置锁标志位)为00),此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程B会进入自旋等待获得该轻量级锁。
主要目的:在没有多线程竞争的前提下,通过CAS减少重量级锁使用操作系统互斥量产生的性能消耗,说白了先自旋,不行才升级阻塞。升级时机:当关闭偏向锁功能或多线程竞争偏向锁会导致偏向锁升级为轻量级锁
假如线程A已经拿到锁,这时线程B又来抢该对象的锁,由于该对象的锁已经被线程A拿到,当前该锁已是偏向锁了。
而线程B在争抢时发现对象头MarkWord中的线程ID不是线程B自己的线程ID(而是线程A),那线程B就会进行CAS操作希望能获得锁。此时线程B操作中有两种情况:
如果锁获取成功,直接替换MarkWord中的线程ID为B自己的ID(A→B),重新偏向于其他线程(即将偏向锁交给其他线程,相当于当前线程"被"释放了锁),该锁会保持偏向锁状态,A线程Over,B线程上位;
如果锁获取失败,则偏向锁升级为轻量级锁(设置偏向锁标识为0并设置锁标志位)为00),此时轻量级锁由原持有偏向锁的线程持有,继续执行其同步代码,而正在竞争的线程B会进入自旋等待获得该轻量级锁。
自旋多少次升级为重量级锁
Java6之前
默认10次或者cpu核数的一半
Java6之后
根据同一个线程上次自旋的时间决定
MarkedWord存储的是指向线程栈中Lock Record锁记录的指针
重量级锁
场景:多个线程来访问竞争
MarkedWord存储的是指向堆中的monitor(管程)对象的指针
直接到操作系统级别,使用monitor管程
总结
锁升级之后,本来存储hashcode的位置被占用了,那么hashcode 去哪里了
无锁状态
当调用hashcode()之后,将永远不会升级为偏向锁,会跳过偏向锁升级为轻量级锁
偏向锁状态
收到hashcode()请求之后,会立刻撤销偏向状态,膨胀为重量级锁
轻量级锁状态
会存储在lock record空间中
重量级锁状态
会存储在ObjectMonitor对象中
各种锁的优缺点对比
JIT(Just In Compiler)即时编译器对锁的优化
锁消除
子主题
锁粗化
子主题
子主题
为什么synchronized是非公平的
为什么synchronized是悲观锁,乐观锁的原理是什么,CAS是什么
八锁
主要是判断锁的是哪个对象
synchronized和reetrantlock锁,什么情况使用哪种锁
Synchronized 和 Lock 哪个更好?
synchronized和volitile的区别
为什么任何一个对象都可以成为一个锁
什么是管程
Reentrantlock 的实现
什么是死锁,死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决
写一个死锁的代码
条件锁
各种锁(15种锁)
公平锁/非公平锁
可重入(递归)锁/不可重入锁
独享锁/共享锁
互斥锁/读写锁
乐观锁/悲观锁
乐观锁是怎么保证一致性的
乐观锁一定是好的吗
分段锁
偏向锁/轻量级锁/重量级锁
自旋锁
请手写一个自旋锁
Java加锁有哪几种方式
互斥锁(mutex)和自旋锁(spinlock)分别在什么场景使用?
线程状态
有多少种方法可以让线程阻塞,能说多少说多少
sleep和wait的区别
线程的五态?转化过程?线程的生命周期
多线程状态图,状态如何流转?
什么情况线程会进入waiting状态
简述多进程开发中 join 和 deamon 的区别?
为什么要分内核态和用户态?
线程通信
Java 线程间怎么实现同步
notify和notifyAll的区别
两个线程如何串行执行
生产者消费者模式(三种写法)
synchronized
Lock
阻塞队列
线程实现顺序执行
CAS
CAS知道吗
CAS底层原理?
如果知道谈谈UnSafe类的理解
CAS缺点,引出ABA问题
原子类AtomicInteger的ABA问题?原子更新引用知道吗?
AQS
LockSupport
什么是AQS
AQS为什么是JUC内容中最重要的基石
AQS能干什么
AQS同步器框架
加锁
tryAcquire方法
addWaiter
acquireQueued
解锁
AQS使用的是FIFO的队列,为什么还有公平非公平
子主题
图解(用银行排队来解释)
初始状态
子主题
A占领
子主题
B进入等候队列
子主题
C进入等候队列
子主题
A任务结束,B任务唤醒
子主题
子主题
线程池
描述下线程池的处理流程
线程池ThreadPoolExecutor的实现原理
线程池的7个参数分别是什么含义
线程池的拒绝任务策略
有哪几种常用的线程池
如果我想实现 newSingleThreadPool,应该怎么配置,构造方法传什么
参数
参数
线程池如何做负载均衡
用过线程池吗,对应的好处,如何用?
为什么要用线程池;
提交任务时execute和submit方法的区别?
1000 个多并发线程,10 台机器,每台机器 4 核的,设计线程池大小。
为什么cpu密集比io密集设置的线程数少
在工作中单一的/固定数的/可变的三种创建线程池的方法哪个用的多?
最大线程的数量设置为多少
图
子主题
阻塞队列
说说阻塞队列的实现:可以参考ArrayBlockingQueue的底层实现
为什么用阻塞队列
BlockingQueue的核心方法
三种常见的阻塞队列
阻塞队列用在哪里
CountDownLatch/CyclicBarrier/Semaphore使用过吗?
CountDownLatch闭锁
CyclicBarrier屏障
Semaphore信号量
ThreadlLocal
简介
Thread和ThreadLocal中ThreadLocalMap的数据结构和关系
图片
ThreadLocalMap中的Key是弱引用,这是为什么?
ThreadLocal中的内存泄露问题,ThreadLocal中最后为什么要加remove方法
线程中断
中断协商机制
将线程的中断标识设置为 true,程序员需要写代码不断检查该标识,判断是否中断,接下来的业务代码自己实现
如何停止中断运行中的线程
volitile关键字
原子类
interrupt
当前线程的中断标识为true,是不是线程立刻停止
不会立即停止,只会设置中断状态
当出现异常的时候会怎么样?
静态方法 Thread.interrupted()谈谈你的理解
返回当前的中断状态,并且将中断状态重置为 false
琐碎知识
Java中用到的线程调度算法是什么
什么是cpu密集型和io密集型
IO密集型的cpu*2是怎么计算出来的
用过并发包的哪些类;
进程和线程区别?
多线程条件变量为什么要在 while 体里
如何实现线程调度算法
Runnable和Callable的区别
可以运行时kill掉一个线程吗
上下文切换是什么含义
什么是守护线程?有什么作用
线程和进程的差别是什么?
java线程中启动一个线程是用run还是start
并发容器有哪些,并发容器和同步容器的区别
线程方法中的异常如何处理?副线程可以捕获异常吗
线程安全(阻塞同步,非阻塞同步,无同步)
手写 java 多线程
如何实现一个线程安全的数据结构
Java怎么获取线程的返回值
线程越多效率越高吗?
系统设计
五万人并发抢票怎么实现;
什么地方用了多线程
一个任务分成十个任务,最后汇总计算,不能用 fork/join
讲一下线程安全问题产生的原因?
高并发下有哪些常用的技术解决方案,举三个高并发场景设计例子
高并发情况,系统的优化方案有哪些,以及优先级排序。
fork函数,父子进程的区别,孤儿进程,僵尸进程会有什么问题,进程有哪些状态,进程间怎么同步,通信,消息队列,管道怎么实现的,进程调度算法,各有什么优缺点
JVM/GC
字节码
i++和++i的区别
类加载机制
类加载(装载)器有几种
双亲委派模型,为什么要用双亲委派
类加载机制,一个类加载到虚拟机中一共有几个步骤,这些步骤的顺序哪些是固定的,哪些是不固定的,为什么不固定
加载:根据类路径将硬盘上的.class文件加载进内存,加载时用到了双亲委派机制。
校验:JVM作为成熟的商用虚拟机标准,肯定要对各种输入进行仔细的检查和校验,防止hacker攻击。
准备:为类中的static字段和static final字段开辟空间,将类中的static字段赋默认值,为static final字段赋初始化值。
解析:将有变量、方法等元素的 符号引用 指向 直接引用 。
初始化:将static字段赋初始化值以及相应的类初始化工作。
使用:在程序中使用Class对象。
卸载:当不再以任何形式引用到该类对象及其变量,并且相应的ClassLoader也已经被卸载,这个时候该类可被卸载。
完整顺序
什么是符号引用?什么是直接引用?
符号引用
直接引用
图
子主题
堆内存
JVM数据存储模型,新生代、年老代的构造?
堆里面的分区:Eden,survival(from to) 老年代各自的特点
内存溢出是怎么回事?请举一个例子?如何排查
内存泄露是怎么回事?请举个例子如何排查
java有自己的内存回收机制,但是为什么还会出现内存泄露的问题?
JVM堆的基本结构
JVM 的对象分配在哪个区,Class 对象分配在哪个区
对象什么情况下进入老年代?
新生代的分区?
讲一下堆以及堆排序
字符串常量池在哪里
1.7
在永久带(方法区),也是堆空间
1.8
1.8之后,永久带搬到了元空间(物理内存),JDK8字符串常量池放到堆空间,其引用指向元空间(方法区)的常量池
方法区
方法区和永久代的关系很像Java中接口和类的关系,类实现了接口,而永久代就是HotSpot虚拟机对虚拟机规范中方法区的一种实现方式。
栈内存
栈帧的大小什么时候确定?
垃圾回收
JVM垃圾回收算法
垃圾回收算法和垃圾收集器的关系,分别是什么
怎么看服务器默认的垃圾收集器是哪个?生产上如何配置垃圾收集器? 谈谈你对垃圾收集器的理解
(java GC算法)什么时候会触发minor gc,什么时候会触发full gc?
GC 可达性分析中哪些算是GC ROOT
垃圾收集器
CMS
步骤
初始标记(CMS initial mark)短暂暂停用户线程
并发标记(CMS concurrent mark)和用户线程一起
重新标记(CMS remark)短暂暂停用户线程
并发清除(CMS concurrent sweep)和用户线程一起
优缺点
优点:并发收集停顿低
缺点:并发执行,对CPU压力较大
采用的标记清除算法会产生大量碎片
采用的标记清除算法会产生大量碎片
G1
以前收集器特点
是什么
原理
1
2
3
回收步骤
1
2
3
和CMS相比的优点
默认垃圾回收器
虚拟机调优
虚拟机调优参数
(你熟悉的JVM调优参数)使用过哪些调优工具?
如何查看JVM的内存使用情况
说一个你对 JVM 优化的实际案例,包括实际步骤和方法
dump日志排查有做过吗
如何查看堆内存中对象的个数?
生产环境故障排查
假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位
生产环境服务器变慢,诊断思路和性能评估
有哪些手段排查OOM
JVM的内存结构
各个位置存都是干什么用的
图
1.7
1.8
子主题
虚拟内存分页了解不?(操作系统)
java中常说的堆和栈,分别是什么数据结构;另外,为什么要分为堆和栈来存储数据。
jvm类加载的过程讲讲,符号引用是什么,哪些情况会发生初始化
网络编程/协议
TCP
TCP的滑动窗口协议有什么用?讲讲原理
osi七层网络模型,五层网络模型,每次层分别有哪些协议
TCP和UDP的区别?为什么可靠和不可靠
网络方面有 osi 七层,tcp/ip 五层,分别有哪些协议及作用
tcp 的流量控制和拥塞控制
TCP 连接中的三次握手和四次挥手,四次挥手的最后一个 ack 的作用是
什么,为什么要 time wait,为什么是 2msl
三次握手
四次挥手
最后一个ack的作用
为什么“握手”是三次,“挥手”却要四次?
为什么要time wait?为什么是2msl
TCP/IP 协议涉及哪几层架构?
28、当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤
tcp和udp的区别,tcp怎么保证可靠连接的,出现网络拥塞怎么解决
HTTP
什么是HTTP协议
HTTP协议的交互流程?
HTTP和HTTPS的差异?
REST和Http什么关系?大家都说Rest很轻量,你对Rest风格如何理解
HTTP协议都有哪些方法
一次HTTP协议的全过程,包括域名解析,定位主机等
https是什么
http中重定向和请求转发的区别?
一个完整的http请求会涉及到哪些协议
http请求头,expire,cache-control字段,状态码,301,302,401,403
https原理,数字签名,数字证书,非对称加密算法过程,有什么问题
SSL
SSL的交互流程
webservice
wsdl/soap格式
与rest协议的区别
Socket
Socket交互的基本流程
交换机和路由器的区别
浏览器发生302跳转的背后逻辑
手写 java 的 soeket 编程,服务端和客户端
get与post请求区别?
数据结构与算法
数组
链表
如何判断链表有环
描述一下链式存储结构
倒排序一个LinkedList
手撕算法:反转单链表
如何倒序输出单向链表?
个人直接想法是用栈先进后出的特点,把链表数据读到栈里然后输出。
有更好的实现方式吗?
树
二叉树
如何遍历一棵二叉树
二叉树的深度
平衡二叉树的时间复杂度;
Hash算法和二叉树算法分别什么时候用;
红黑树
为什么允许局部不平衡
B+树和 B-树的区别
说一下 B+tree 和二叉搜索树的区别?说一下二叉搜索树和 AVL 树、红黑树之间的差别
排序算法
冒泡排序
用JAVA写一个冒泡排序算法
快速排序
讲一下快速排序的思想
快速排序的平均复杂多少?最坏情况是什么?
快速排序说一下过程
快速排序非递归实现
实现代码
说一下几种常见的排序算法和分别的复杂度
问了冒泡排序,快排,和归并排序及优缺点和优化
讲一下稳定的排序算法和不稳定的排序算法
排序算法对比
子主题
排序算法优缺点
子主题
子主题
递归
用JAVA写一个递归遍历目录下面的所有文件
算法题
手撕算法: 爬楼梯,写出状态转移方程
手撕算法:实现类似微博子结构的数据结构,输入一系列父子关系,输
出一个类似微博评论的父子结构图
手撕算法:leeetcode 原题 22,Generate Parentheses,给定 n 对括号,请写一个函数以将
其生成新的括号组合,并返回所有组合结果。
代码题:两个有序数组,数组中存在重复数字,合并成一个有序数组,去除重复数字。
两个 10G 的文件,里面是一些 url,内存只有 1G,如何将这两个文件合并,找到相同的 url?
手撕算法:给定一个数字三角形,找到从顶部到底部的最小路径和。每
一步可以移动到下面一行的相邻数字上。然后继续在这个问题上扩展
. 求出最短那条的路径
. 递归求出所有的路径
一步可以移动到下面一行的相邻数字上。然后继续在这个问题上扩展
. 求出最短那条的路径
. 递归求出所有的路径
给你 50 亿行字符串,机器 4G 内存(只能一台机器),找出重复次数最多的那行字符串?(以行为单位,每行不超过 10 个字符)
海量数据过滤,黑名单过滤一个 url。
各种排序算法、未排序常规数据查找第 K 大的数,时间复杂度。
一千万的用户实时排名如何实现;
设计一个算法,实现两个 10g 大文件在 10m 的内存中将两个大文件中重复的放进第三个文件
一亿个数据取出最大的前100个
直接排序
最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法
的时间复杂度一般为 O(nlogn),如快速排序。
的时间复杂度一般为 O(nlogn),如快速排序。
局部淘汰法
该方法与排序方法类似,用一个容器保存前 100 个数,然后将剩余的所
有数字——与容器内的最小数字相比,如果所有后续的元素都比容器内的 10000 个数还
小,那么容器内这个 100 个数就是最大 100 个数。如果某一后续元素比容器内最
小数字大,则删掉容器内最小元素,并将该元素插入容器,最后遍历完这 1 亿个数,得
到的结果容器中保存的数即为最终结果了。此时的时间复杂度为 O(n+m^2),其中 m
为容器的大小,即 100。
有数字——与容器内的最小数字相比,如果所有后续的元素都比容器内的 10000 个数还
小,那么容器内这个 100 个数就是最大 100 个数。如果某一后续元素比容器内最
小数字大,则删掉容器内最小元素,并将该元素插入容器,最后遍历完这 1 亿个数,得
到的结果容器中保存的数即为最终结果了。此时的时间复杂度为 O(n+m^2),其中 m
为容器的大小,即 100。
分治法
将 1 亿个数据分成 100 份,每份 100 万个数据,找到每份数据中最大的
10000 个,最后在剩下的 10010000 个数据里面找出最大的 10000 个。如果 100
万数据选择足够理想,那么可以过滤掉 1 亿数据里面 99%的数据。100 万个数据里面
查找最大的 10000 个数据的方法如下:用快速排序的方法,将数据分为 2 堆,如果大
的那堆个数 N 大于 10000 个,继续对大堆快速排序一次分成 2 堆,如果大的那堆个
数 N 大于 10000 个,继续对大堆快速排序一次分成 2 堆,如果大堆个数 N 小于
10000 个,就在小的那堆里面快速排序一次,找第 10000-n 大的数字;递归以上过
程,就可以找到第 1w 大的数。参考上面的找出第 1w 大数字,就可以类似的方法找到
前 10000 大数字了。此种方法需要每次的内存空间为 10^64=4MB,一共需要 101
次这样的比较。
10000 个,最后在剩下的 10010000 个数据里面找出最大的 10000 个。如果 100
万数据选择足够理想,那么可以过滤掉 1 亿数据里面 99%的数据。100 万个数据里面
查找最大的 10000 个数据的方法如下:用快速排序的方法,将数据分为 2 堆,如果大
的那堆个数 N 大于 10000 个,继续对大堆快速排序一次分成 2 堆,如果大的那堆个
数 N 大于 10000 个,继续对大堆快速排序一次分成 2 堆,如果大堆个数 N 小于
10000 个,就在小的那堆里面快速排序一次,找第 10000-n 大的数字;递归以上过
程,就可以找到第 1w 大的数。参考上面的找出第 1w 大数字,就可以类似的方法找到
前 10000 大数字了。此种方法需要每次的内存空间为 10^64=4MB,一共需要 101
次这样的比较。
hash法
Hash 法,如果这 1 亿个书里面有很多重复的数,先通过 Hash 法,把这 1 亿个数字
去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通
过分治法或最小堆法查找最大的 10000 个数。
去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通
过分治法或最小堆法查找最大的 10000 个数。
最小堆法
首先读入前 10000 个数来创建大小为 10000 的最小堆,建堆的时间复
杂度为 O(mlogm)(m 为数组的大小即为 10000),然后遍历后续的数字,并于堆
顶(最小)数字进行比较。如果比最小的数小,则继续读取后续数字;如果比堆顶数字
大,则替换堆顶元素并重新调整堆为最小堆。整个过程直至 1 亿个数全部遍历完为止。
然后按照中序遍历的方式输出当前堆中的所有 10000 个数字。该算法的时间复杂度为
O(nmlogm),空间复杂度是 10000(常数)。
杂度为 O(mlogm)(m 为数组的大小即为 10000),然后遍历后续的数字,并于堆
顶(最小)数字进行比较。如果比最小的数小,则继续读取后续数字;如果比堆顶数字
大,则替换堆顶元素并重新调整堆为最小堆。整个过程直至 1 亿个数全部遍历完为止。
然后按照中序遍历的方式输出当前堆中的所有 10000 个数字。该算法的时间复杂度为
O(nmlogm),空间复杂度是 10000(常数)。
对于一个字符串,计算其中最长回文子串的长度
算法1:给定一个长度为N的整形数组arr,其中有N个互不相等的自然数1-N,请实现arr的排序,但是不要把下标0∼N−1位置上的数通过直接赋值的方式替换成1∼N
算法2:判断一个树是否是平衡二叉树
算法:给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少,这个路径的开始节点和结束节点可以是二叉树中的任意节点
算法:求一个float数的立方根,牛顿迭代法
算法:最长不重复的连续子串
算法:求一个环形链表的环的长度
算法:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先
对于一个字符串,计算其中最长回文子串的长度
算法:返回一个树的左视图
算法:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表
算法:链表按k个一组反转。
将阿拉伯数字转为大写的汉语数字。注意处理零值,以及三千七百这种。
旋转有序数组中找到某个值?二分查找。
超大文件排序应该怎么排?
给一个数组和一个数,找出数组中按照该数的全排列。
数组跳跃到最后需要的最少步。
0-1背包问题。
LRU算法,slab分配,如何减少内存碎片
请描述一致性hash 算法
图的广度优先算法和深度优先算法:详见jvm中垃圾回收实现;
时间复杂度
1.剑指Offer:https://www.nowcoder.com/ta/coding-interviews
2.刷Leetcode,刷Leetcode,刷Leetcode!重要的事情说三遍,Leetcode前200道
3.经典排序算法:https://blog.csdn.net/qq_35508033/article/details/109399281
2.刷Leetcode,刷Leetcode,刷Leetcode!重要的事情说三遍,Leetcode前200道
3.经典排序算法:https://blog.csdn.net/qq_35508033/article/details/109399281
设计模式与重构
单例
手写单例包括多线程下
写一个单例(懒汉式,恶汉式,并发初始化,volatile与lock的使用)
解析
饿汉式(不存在线程安全问题,但是要提前占用系统资源)
举几个常见的设计模式
你在设计一个工厂的包的时候会遵循哪些原则
你能列举一个使用了Vistitor/Decorator模式的开源项目/库吗?
你再编码时最常用的设计模式有哪些?在什么场景下用?
JDK源码中有哪些让你印象深刻的设计模式?举例
会不会滥用设计模式
从简单的生产者消费者模式设计到如何高效健壮实现等等。
用过哪些设计模式,手写一个(除单例)
重构过代码没有?说说经验
你知道有哪些设计原则?
没有人会讨厌和拒绝认真准备面试的人,所以不要认为面试就是必须用一个“素颜”的你去“真诚”的面对。
0 条评论
下一页