面试知识点准备
容器
常见集合容器底层实现原理
- interface Collection
- interface Set
- interface SortedSet
- class TreeSet 基于红黑树,有序,查询效率低
- class HashSet 基于哈希表,无序,查询效率高
- class LinkedHashSet 基于双向链表,有序,查询效率高
- interface List
- class ArrayList 基于动态数组,支持随机访问
- class Vector 与ArrayList类似,但是线程安全
- class LinkedList 基于双向链表,顺序访问,可快速增删元素.可用作栈,队列和双向队列
- interface Queue
- class LinkedList 可用作双向队列
- class PriorityQueue 基于堆,可以实现优先队列
- interface Map
- interface SortedMap
- class HashMap 基于哈希表,JDK8后变为数组+链表+红黑树
- class HashTable 和HashMap类似,但是线程安全
- class LinkedHashMap 基于双向链表
HashMap与HashTable
- HashMap是非线程安全的,HashTable是线程安全的.
- HashMap的初始容量为1>>4即16,扩容为2倍,比较耗时.HashTable初始为11,扩容为2倍+1.(超过阈值=容量 * 负载因子时扩容)
- HashMap中存放Entry对象
- HashMap可以存放null作为key,HashTable不可以.
- HashMap存贮结构为数组+链表,在JDK8中变为数组+链表+红黑树(链表中长度超过8或容量超过64时)
ConcurrentHashMap什么时候用
因为HashTable在多线程下的效率低下(容器全锁),因此在多线程下推荐使用ConcurrentHashMap
并发
synchronized与Lock
- 都是可重入锁,默认都是非公平锁,Lock可通过构造函数创建公平锁
- ReentrantLock锁的粒度和灵活度优于synchronized
- synchronized是没有超时不可中断的,ReentrantLock有超时可中断
- ReentrantLock锁可以绑定多个条件,可用Condition类实现分组唤醒
- 在资源竞争不激烈的情况下,性能推荐使用synchronized
- 在资源竞争激烈的情况下,性能会下降几十倍,推荐使用ReentrantLock
volatile
当一个变量定义为 volatile 之后,将具备两种特性
- 保证此变量的变化能够被其他线程获取
- 禁止指令重排序优化
线程池有哪几种
线程池都使用Executors来创建,可以使用execute()和submit()来执行线程任务,前者只接收Runnable作为参数,后者还可接收Callable作为参数,并通过Future对象来获取返回值及存储的异常信息,使用get()获取返回值会阻塞主线程,直到该线程运行结束得到返回值,因此常用Callable+FutureTask来获取返回值
- newCachedThreadPool - 可缓存线程池,理论上线程数无上限
- newFixedThreadPool - 可重用固定个数的线程池
- newScheduledThreadPool - 可重用固定个数的线程池,执行定时及周期性任务
- newSingleThreadExecutor - 单线程核心的线程池
- newSingleThreadScheduledExecutor - 单线程核心的线程池,执行定时及周期性任务
- newWorkStealingPool - 具有抢占式操作的线程池
阿里巴巴强制线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor构造函数的方式
线程池的参数
- corePoolSize 线程池核心线程大小
- maximumPoolSize 线程池最大线程数量
- keepAliveTime 空闲线程存活时间
- unit 空间线程存活时间单位
- workQueue 工作队列
- threadFactory 线程工厂
- handler 拒绝策略
前五个是必须的
MySQL
SQL执行速度慢
- 在服务器上确认服务器状态信息,是否磁盘满或资源占用高
- 查询语句写的不合理
- 创建的索引失效
- 关联查询太多join
- 服务器调优及各个参数设置
存储引擎InnoDB、MyISAM
- InnoDB支持事务,支持四种隔离级别.MyISAM不支持事务.
- InnoDB支持行级锁及外键约束,可支持写并发.MyISAM支持表级锁.
- 不存储总行数.MyISAM有一个变量存储总行数.
- Innodb不支持全文索引.MyISAM支持全文索引.
- Innodb必须有唯一索引如主键,如果没有会自己找或生产一个.MyISAM可以没有
- InnoDB支持外键,而MyISAM不支持
InnoDB支持事务,行级锁,外键必须有唯一索引,不支持全文索引,不存贮总行数
MyISAM不支持事务和外键,只支持表级锁,有一个变量存储总行数,可以没有主键,支持全文索引
事务的四大特性
- 原子性A
- 一致性C
- 隔离性I
- 持久性D
索引
索引是MySQL高速获取数据的数据结构,可以提高查询效率,简单的说是排好序的快速查找数据结构
索引类型: 单值索引 / 唯一索引 / 复合索引 / 全文索引
语法:
CREATE [UNIQUE] INDEX indexName ON tableName(columnName(length));
ALTER TABLE tableName ADD INDEX indexName (columnName);
索引失效的情况
- 有or必全有索引
- 复合索引未用左列字段
- like以%开头
- 需要类型转换
- where中索引列有运算
- where中索引列使用了函数
- 如果mysql觉得全表扫描更快时(数据少)
隔离级别
Isolation Level |
隔离级别 |
脏读 |
不可重复读 |
幻读 |
默认 |
解释 |
READ-UNCOMMITTED |
读取未提交 |
1 |
1 |
1 |
|
最低的隔离级别,允许读取尚未提交的数据变更 |
READ-COMMITTED |
读取已提交 |
0 |
1 |
1 |
|
允许读取并发事务已经提交的数据 |
REPEATABLE-READ |
可重复读 |
0 |
0 |
1 |
默认 |
对同一字段的多次读取结果都是一致的 |
SERIALIZABLE |
可串行化 |
0 |
0 |
0 |
|
最高的隔离级别,完全服从ACID的隔离级别 |
数据库表优化
- 限定数据范围
- 书写分离 主库负责写,从库负责读
- 垂直拆分 拆分成多张表,字段不同
- 水平拆分 最好分库
NoSQL
Redis相比memcache的优势在哪里
两者都是基于内存的数据库,就是NoSQL,性能都很高,都常作缓存使用,都有国企策略
- mem只支持KV形式的数据,即hash类型;Redis除此之外,还支持string/list/set/sorted set数据结构
- Redis支持数据的持久化,因此具有灾难恢复机制,mem只能保存在内存中
- mem是多线程的,早期的Redis是单线程的,更容易开发维护,后期加入了多线程的支持
Redis如何判断数据是否过期
Redis有一个过期字典来保存数据过期的时间.
Redis的持久化机制有哪些
- RDB快照(snapshotting) 默认
- AOF只追加文件(append-only file) 实时性更好,主流
Redis可能回出现的问题
缓存穿透: 缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
- 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截
- 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
缓存击穿: 缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
- 设置热点数据永远不过期
- 加互斥锁
缓存雪崩: 缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
- 设置热点数据永远不过期。
和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
框架
Spring
Spring Boot
Spring Cloud
- 服务注册中心 Eureka -> Nacos
- 服务调用1 Ribbon -> LoadBalancer
- 服务调用2 Feign -> OpenFeign
- 服务降级 Hystrix -> Alibaba Sentinel
- 服务网关 Zuul -> Gateway
- 服务配置 Config -> Nacos
- 服务总线 Bus -> Nacos
- 服务注册中心
- Eureka 自带,已停更
- Zookeeper 老项目常用
- Consul 不建议
- Nacos 完美替换Eureka
- 服务调用1
- Ribbon 慢慢被淘汰
- LoadBalancer 正在发展
- 服务调用2
- Feign 已停更
- OpenFeign 替换方案
- 服务降级
- Hystrix 已停更,但仍大量使用
- resilience4j 国外使用较多
- Alibaba Sentinel 推荐使用
- 服务网关
- Zuul 已停更
- Gateway 目前的主流
- 服务配置
- Config 已不推荐
- Nacos 推荐
- 服务总线
- Bus 已不推荐
- Nacos 推荐
中间件
消息中间件MQ
核心目标: 解耦、异步、削峰
- ActiveMQ 时间早,社区不活跃
- RabbitMQ erlang语言
- RocketMQ 阿里出品,吞吐量大
- Kafka scala语言,大数据首选,吞吐量大
生产者 - 消费者(主题,订阅)
算法与数据结构
算法
- 递推法
- 递归法
- 穷举法
- 贪心算法
- 分治法
- 动态规划法
- 迭代法
- 分支界限法
数据结构
- 数组(Array)
- 栈(Stack)
- push() 添加元素
- pop() 弹出栈顶元素
- peek() 获取栈顶元素
- empty() 判断栈是否为空
- 队列(Queue)
- add() 添加元素,可能只抛出异常添加失败
- offer() 添加元素,推荐使用
- remove() 移除头部元素并返回,空队列抛异常
- element() 返回头部元素不移除,空队列抛异常
- poll() 移除头部元素并返回,空队列返回null
- peek() 返回头部元素不移除,空队列返回null
- 链表(Linked List)
- 树(Tree)
- 图(Graph)
- 堆(Heap)
- 散列表(Hash)
未整理
Lock锁的原理(ReentrantLock)
Condition实现原理
CAS原理(自旋锁)及使用场景
锁升级概念
ThreadLocal
垃圾回收机制
CMS流程的优缺点
类加载机制
JVM内存模型,内存划分,体系结构
内存溢出的分析,常见原因及解决方案
JVM中对象被回收的判断依据
JVM调优
MySQL的分库分表,读写分离
Zookeeper的原理和使用场景
微服务框架(Dubbo, Spring Cloud)
面试知识点准备
原文:https://www.cnblogs.com/thifern/p/14193191.html