首页 > 其他 > 详细

面试知识点准备

时间:2020-12-26 17:44:16      阅读:17      评论:0      收藏:0      [点我收藏+]

面试知识点准备

容器

常见集合容器底层实现原理

  • 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 TreeMap 基于红黑树
    • class HashMap 基于哈希表,JDK8后变为数组+链表+红黑树
    • class HashTable 和HashMap类似,但是线程安全
    • class LinkedHashMap 基于双向链表

HashMap与HashTable

  1. HashMap是非线程安全的,HashTable是线程安全的.
  2. HashMap的初始容量为1>>4即16,扩容为2倍,比较耗时.HashTable初始为11,扩容为2倍+1.(超过阈值=容量 * 负载因子时扩容)
  3. HashMap中存放Entry对象
  4. HashMap可以存放null作为key,HashTable不可以.
  5. HashMap存贮结构为数组+链表,在JDK8中变为数组+链表+红黑树(链表中长度超过8或容量超过64时)

ConcurrentHashMap什么时候用

因为HashTable在多线程下的效率低下(容器全锁),因此在多线程下推荐使用ConcurrentHashMap

并发

synchronized与Lock

  • 都是可重入锁,默认都是非公平锁,Lock可通过构造函数创建公平锁
  • ReentrantLock锁的粒度和灵活度优于synchronized
  • synchronized是没有超时不可中断的,ReentrantLock有超时可中断
  • ReentrantLock锁可以绑定多个条件,可用Condition类实现分组唤醒
  • 在资源竞争不激烈的情况下,性能推荐使用synchronized
  • 在资源竞争激烈的情况下,性能会下降几十倍,推荐使用ReentrantLock

volatile

当一个变量定义为 volatile 之后,将具备两种特性

  1. 保证此变量的变化能够被其他线程获取
  2. 禁止指令重排序优化

线程池有哪几种

线程池都使用Executors来创建,可以使用execute()和submit()来执行线程任务,前者只接收Runnable作为参数,后者还可接收Callable作为参数,并通过Future对象来获取返回值及存储的异常信息,使用get()获取返回值会阻塞主线程,直到该线程运行结束得到返回值,因此常用Callable+FutureTask来获取返回值

  1. newCachedThreadPool - 可缓存线程池,理论上线程数无上限
  2. newFixedThreadPool - 可重用固定个数的线程池
  3. newScheduledThreadPool - 可重用固定个数的线程池,执行定时及周期性任务
  4. newSingleThreadExecutor - 单线程核心的线程池
  5. newSingleThreadScheduledExecutor - 单线程核心的线程池,执行定时及周期性任务
  6. newWorkStealingPool - 具有抢占式操作的线程池

阿里巴巴强制线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor构造函数的方式

线程池的参数

  1. corePoolSize 线程池核心线程大小
  2. maximumPoolSize 线程池最大线程数量
  3. keepAliveTime 空闲线程存活时间
  4. unit 空间线程存活时间单位
  5. workQueue 工作队列
  6. threadFactory 线程工厂
  7. handler 拒绝策略

前五个是必须的

MySQL

SQL执行速度慢

  1. 在服务器上确认服务器状态信息,是否磁盘满或资源占用高
  2. 查询语句写的不合理
  3. 创建的索引失效
  4. 关联查询太多join
  5. 服务器调优及各个参数设置

存储引擎InnoDB、MyISAM

  1. InnoDB支持事务,支持四种隔离级别.MyISAM不支持事务.
  2. InnoDB支持行级锁及外键约束,可支持写并发.MyISAM支持表级锁.
  3. 不存储总行数.MyISAM有一个变量存储总行数.
  4. Innodb不支持全文索引.MyISAM支持全文索引.
  5. Innodb必须有唯一索引如主键,如果没有会自己找或生产一个.MyISAM可以没有
  6. InnoDB支持外键,而MyISAM不支持

InnoDB支持事务,行级锁,外键必须有唯一索引,不支持全文索引,不存贮总行数
MyISAM不支持事务和外键,只支持表级锁,有一个变量存储总行数,可以没有主键,支持全文索引

事务的四大特性

  1. 原子性A
  2. 一致性C
  3. 隔离性I
  4. 持久性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的隔离级别

数据库表优化

  1. 限定数据范围
  2. 书写分离 主库负责写,从库负责读
  3. 垂直拆分 拆分成多张表,字段不同
  4. 水平拆分 最好分库

NoSQL

Redis相比memcache的优势在哪里

两者都是基于内存的数据库,就是NoSQL,性能都很高,都常作缓存使用,都有国企策略

  1. mem只支持KV形式的数据,即hash类型;Redis除此之外,还支持string/list/set/sorted set数据结构
  2. Redis支持数据的持久化,因此具有灾难恢复机制,mem只能保存在内存中
  3. mem是多线程的,早期的Redis是单线程的,更容易开发维护,后期加入了多线程的支持

Redis如何判断数据是否过期

Redis有一个过期字典来保存数据过期的时间.

Redis的持久化机制有哪些

  1. RDB快照(snapshotting) 默认
  2. AOF只追加文件(append-only file) 实时性更好,主流

Redis可能回出现的问题

缓存穿透: 缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

  1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿: 缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

  1. 设置热点数据永远不过期
  2. 加互斥锁

缓存雪崩: 缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据永远不过期。

和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

框架

Spring

Spring Boot

Spring Cloud

  • 服务注册中心 Eureka -> Nacos
  • 服务调用1 Ribbon -> LoadBalancer
  • 服务调用2 Feign -> OpenFeign
  • 服务降级 Hystrix -> Alibaba Sentinel
  • 服务网关 Zuul -> Gateway
  • 服务配置 Config -> Nacos
  • 服务总线 Bus -> Nacos
  1. 服务注册中心
    1. Eureka 自带,已停更
    2. Zookeeper 老项目常用
    3. Consul 不建议
    4. Nacos 完美替换Eureka
  2. 服务调用1
    1. Ribbon 慢慢被淘汰
    2. LoadBalancer 正在发展
  3. 服务调用2
    1. Feign 已停更
    2. OpenFeign 替换方案
  4. 服务降级
    1. Hystrix 已停更,但仍大量使用
    2. resilience4j 国外使用较多
    3. Alibaba Sentinel 推荐使用
  5. 服务网关
    1. Zuul 已停更
    2. Gateway 目前的主流
  6. 服务配置
    1. Config 已不推荐
    2. Nacos 推荐
  7. 服务总线
    1. Bus 已不推荐
    2. Nacos 推荐

中间件

消息中间件MQ

核心目标: 解耦、异步、削峰

  1. ActiveMQ 时间早,社区不活跃
  2. RabbitMQ erlang语言
  3. RocketMQ 阿里出品,吞吐量大
  4. Kafka scala语言,大数据首选,吞吐量大

生产者 - 消费者(主题,订阅)

算法与数据结构

算法

  • 递推法
  • 递归法
  • 穷举法
  • 贪心算法
  • 分治法
  • 动态规划法
  • 迭代法
  • 分支界限法

数据结构

  1. 数组(Array)
  2. 栈(Stack)
    • push() 添加元素
    • pop() 弹出栈顶元素
    • peek() 获取栈顶元素
    • empty() 判断栈是否为空
  3. 队列(Queue)
    • add() 添加元素,可能只抛出异常添加失败
    • offer() 添加元素,推荐使用
    • remove() 移除头部元素并返回,空队列抛异常
    • element() 返回头部元素不移除,空队列抛异常
    • poll() 移除头部元素并返回,空队列返回null
    • peek() 返回头部元素不移除,空队列返回null
  4. 链表(Linked List)
  5. 树(Tree)
  6. 图(Graph)
  7. 堆(Heap)
  8. 散列表(Hash)

未整理

Lock锁的原理(ReentrantLock)

Condition实现原理

CAS原理(自旋锁)及使用场景

锁升级概念

ThreadLocal

垃圾回收机制

CMS流程的优缺点

类加载机制

JVM内存模型,内存划分,体系结构

内存溢出的分析,常见原因及解决方案

JVM中对象被回收的判断依据

JVM调优

MySQL的分库分表,读写分离

Zookeeper的原理和使用场景

微服务框架(Dubbo, Spring Cloud)

面试知识点准备

原文:https://www.cnblogs.com/thifern/p/14193191.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!