Java 相关知识
1. Java基础
- 重载和重写的区别
- String 和 StringBuffer、StringBuilder 的区别是什么?String 为什么是不可变的?
- 自动装箱与拆箱
- == 与 equals
- final 关键字
- 修饰类/方法: 不可继承
- 修饰变量: 不可重新赋值
- Object类的常见方法
equals, hashcode, clone, finalize(被GC的时候自动调用)
- Java 中的异常处理
http://www.bjpowernode.com/tutorial_baseinterviewquestions/199.html
- 获取用键盘输入常用的的两种方法
1
2
3
4
5
6// Method1
Scanner input = new Scanner(System.in);
String s = input.nextLine();
// Method 2
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine(); - 接口和抽象类的区别是什么
2. 集合框架
2.1 Map
2.1.1 HashMap
- key可以为null
- https://blog.csdn.net/visant/article/details/80045154
- https://www.cnblogs.com/constantingF/p/7446307.html
- https://www.e-learn.cn/content/qita/952273
2.1.2 HashSet
2.1.3 LinkedHashMap
2.1.4 ConcurrentHashMap
2.1.5 HashTable
- HashTable = synchronized HashMap
- https://www.cnblogs.com/owenma/p/8554568.html
2.1.6 HashMap 的长度为什么是2的幂次方
2.1.7 HashMap 多线程操作导致死循环问题(HashMap扩容原理)
- https://blog.csdn.net/zhuqiuhui/article/details/51849692
- https://segmentfault.com/a/1190000015812438?utm_source=tag-newest
- https://www.jianshu.com/p/619a8efcf589
2.1.8 ConcurrentHashMap 和 HashTable的区别
- HashTable是全局锁, ConcurrentHashMap是Segment锁(分段锁)
2.2 Collection
2.2.1 Arraylist 与 LinkedList 异同
2.2.2 ArrayList 与 Vector 区别
2.3 copyOnWrite
2.4 Collection和Collections区别
- Collection是集合的接口, Collections是集合工具类
3. 多线程与并发
3.1 ThreadLocal原理(对比 volitile)
3.2 什么是上下文切换
CPU通过时间片分配算法来循环执行任务, 当前任务执行一个时间片后会切换到下一个任务. 但是, 在切换前会保存上一个任务的状态, 以便下次切换回这个任务时, 可以再次加载这个任务的状态, 从任务保存到再加载的过程就是一次上下文切换.
3.3 用户态和内核态
3.4 CAS, ABA问题
3.5 各种锁
3.5.1 自旋, 互斥, 读写
3.5.2 乐观锁, 悲观锁
3.5.3 CLH, MCS
3.5.3.1 CLH
- https://www.jianshu.com/p/1b1b44e84394
- https://www.jianshu.com/p/5ad8539e25c3
- http://cmsblogs.com/?p=2188
- 直接看代码
3.5.3.2 MCS
3.5.4 可重入锁, 不可重入锁
3.5.5 synchronized
3.5.5.1 基本概念和使用
- https://blog.csdn.net/xuqiaobo/article/details/51513871
- https://blog.csdn.net/aiyawalie/article/details/53261823
- 说说 synchronized 关键字和 volatile 关键字的区别
3.5.5.2 原理(难点)
- https://www.jianshu.com/p/36eedeb3f912
- https://www.jianshu.com/p/9998a9db17f7
- https://www.jianshu.com/p/31b6a0b1b84b
3.5.5.3 synchronized和ReentrantLock
- https://baijiahao.baidu.com/s?id=1638104862611986445&wfr=spider&for=pc
- https://cloud.tencent.com/developer/article/1414968
3.6 AQS实现原理(java并发包的了解)
3.6.1 基本
3.6.2 资源共享方式
3.6.3 模板方法模式(设计模式)
3.6.3.1 基本
3.6.3.2 应用
3.7 Atomic
3.7.1 Atomic原子类, 使用
- 连接太长
- 四类Atomic: 基本类型, 数组类型, 引用类型, 对象属性修改类型
3.7.2 原理
3.8 多线程
3.8.1 wait方法和sleep方法的区别
3.8.2 Java线程池原理
- https://yq.aliyun.com/articles/687794
- https://blog.51cto.com/14230003/2418026?source=dra
- https://blog.csdn.net/weixin_28760063/article/details/81266152
- https://www.cnblogs.com/a8457013/p/7819044.html
3.8.3 设置线程数一般基于哪些考虑
- https://www.jianshu.com/p/1f5195dcc75b
- https://www.jianshu.com/p/fbac33d72bd2
- https://blog.csdn.net/qrne06/article/details/80587576
3.8.4 为什么要用线程池
3.8.5 如何创建线程池
3.8.6 实现Runnable接口和Callable接口的区别
3.8.7 执行execute()方法和submit()方法的区别是什么呢?
3.8.8 Latch, Barrier, Semaphore使用场景
3.8.8.1 CountDownLatch
3.8.8.2 CyclicBarrier
3.8.8.3 Semaphore
3.8.9 Future, FutureTask, CompletionService的使用(JUC的了解)
3.8.9.1 Future, FutureTask
3.8.9.2 CompletionService
4. JVM
4.1 内存结构
- https://juejin.im/post/5c73c6446fb9a04a0d577d14
- https://zhuanlan.zhihu.com/p/38348646
int和Integer有什么区别, 分别存储在哪里
4.2 GC
- https://juejin.im/post/5a15be736fb9a044fc4464d6#heading-12
- https://www.infoq.cn/article/ZOYqRI4c-BFKmUBmzmKN
- https://www.infoq.cn/article/3WyReTKqrHIvtw4frmr3
- 判断一个Java对象是否存活
- 内存泄露(图略)
- CMS/G1
- G1
4.3 ClassLoader
4.4 new 一个对象的过程中发生了什么
4.5 调优
- 常用的性能优化方式有哪些
- 常用的启动参数以及其作用
4.6 JIT
5. Spring
5.1 基本
5.1.1 Bean作用域
5.1.2 IOC
- 只看上面第一节的理论即可
- https://www.jianshu.com/p/17b66e6390fd
- https://www.jianshu.com/p/2808f7c4a24f
- BeanFactory是根基, ApplicationContext提供更高级的用法和属性(面向实际使用的开发者)
- Autowired
5.1.3 AOP
5.1.3.1 基本
5.1.3.2 代理模式
5.1.3.3 应用场景
5.1.4 请求过程
5.1.4.1 Servlet生命周期
5.1.4.2 过程
5.2 相关应用
5.2.1 Mybatis
5.2.2 事务
- 我是如何在面试别人Spring事务时“套路”对方的
- Spring 事务中的隔离级别
- Spring 事务中的事务传播行为
5.3 设计模式
- 常用的设计模式, 应用的例子(23种设计模式)
- 常用设计模式(前5个最常用): 单例, 工厂, 建造者, 代理, 模板方法(AQS), 适配器, 装饰器, 观察者, 策略, 备忘录
- http://c.biancheng.net/design_pattern/
- http://www.cocoachina.com/articles/31808
- 单例模式的几种写法, 优缺点
- 装饰器模式和代理模式的区别 (理解较复杂)
- JDK或Spring中用的设计模式举例(对一些开源源码的了解)
5.4 Spring生态
6. 树, 堆
6.1 树
6.2 堆
7. MySQL
7.1 ACID原则是什么, 隔离级别包含哪些(基础)
- https://blog.csdn.net/tree_ifconfig/article/details/81326892
- https://www.liaoxuefeng.com/wiki/1177760294764384/1179611198786848
- http://www.zsythink.net/archives/1233/
7.2 MyIsam和InnoDB的各种区别(数据库引擎相关)
7.3 索引的底层数据结构, 联合索引的生效规则(索引相关)
7.4 sql查询优化实践经验, explain, profile的使用(sql调优经验)
- https://www.cnblogs.com/binbinyouni/p/6070715.html
- https://www.cnblogs.com/clphp/p/5403215.html
- https://www.jianshu.com/p/2de16472722e
7.5 分库分表相关的了解
7.6 A、B两表, 找出ID字段中, 存在A表, 但是不存在B表的数据
1 | select * from A a left join B b on a.id = b.id where b.id is null |
7.7 为什么索引能提高查询速度?
- 查询时会先去索引列表中一次定位到特定值的行数, 减少遍历匹配的行数
7.8 Mysql如何为表字段添加索引?
1 | alter table `xxx` add index `idx_name` (`col1`, `col2`) |
7.9 大表的常见优化手段
8. 网络编程与操作系统
8.1 网络协议
8.1.1 TCP, UDP
- TCP: 面向连接协议
- UDP: 无连接协议
- 链接1: https://www.cnblogs.com/bokeyuanlongbin/p/9072399.html (先看9, 再看10, 然后看其他所有)
- 连接2: 连接太长
- TCP 拥塞控制
- 连接太长
8.1.2 TCP的三次握手, 四次挥手
- 链接1: 3
8.1.3 HTTP, HTTPS
8.1.3.1 HTTP
8.1.3.2 RSA加密
8.1.3.3 HTTPS
8.1.4 长连接, 短连接
- 此连接指的是TCP连接
- HTTP会话永远都是: 请求响应结束, 长连接指一次TCP连接可以传递多次的HTTP报文信息
- 声明长连接: 客户端和服务端在header中都带上 Connection: keep-alive
- https://segmentfault.com/a/1190000015821798
8.1.5 在浏览器中输入url地址到显示主页的过程
8.1.6 IO/NIO
- https://blog.csdn.net/u013956074/article/details/80974190
- https://www.cnblogs.com/aspirant/p/8630283.html
8.1.7 零拷贝
- https://mp.weixin.qq.com/s/oPv1-wrhYjiOC1o0M0tjMA
- https://my.oschina.net/u/3990817/blog/3045359
- https://zhuanlan.zhihu.com/p/88789697
- 文件传输
- 传输大文件的时候, 使用「异步 I/O + 直接 I/O」
- 传输小文件的时候, 则使用「零拷贝技术」
8.2 操作系统
8.2.1 基本概念
- 进程: 对于操作系统来说, 一个任务就是一个进程, 系统资源分配和调度运行的基本单位
- 线程: 单个进程中执行中每个任务就是一个线程, 是进程中执行运算的最小单位
- 用户态和内核态: https://www.jianshu.com/p/38ea929e1668
8.2.2 算法
8.2.2.1 磁盘调度/电梯调度
- https://blog.csdn.net/qq_27607965/article/details/82355797
- https://blog.51cto.com/acevi/2096277 (代码)
8.2.2.2 缓存淘汰算法: LRU, LFU, FIFO
8.2.3 信号量, 互斥锁 (不好理解)
- https://www.jianshu.com/p/c6ba8bcc22bc
- https://www.nowcoder.com/questionTerminal/c97a743b7ed04995b9810cb6676b22ce?toCommentId=1540700
8.2.4 Linux
8.2.4.1 文件系统
8.2.4.2 常见的 Linux 命令
- cd ls mkdir rm cat tail grep history
8.2.5 进程间通讯的方式有哪些
9. 分布式
9.1 Redis
9.1.1 为什么要用 redis缓存
9.1.2 为什么要用 redis 而不用 map/guava 做缓存?
9.1.3 redis 和 memcached 的区别
9.1.4 常见数据结构
- string
- list: 双向链表
- hash: Java中的HashMap
- set: Java中的HashSet
- zset: 带权重的set
- Streams(新)
- https://blog.csdn.net/shengqianfeng/article/details/82684354
- 使用场景
9.1.5 过期时间, 内存淘汰机制 (内容不多)
9.1.6 持久化机制
怎么保证 redis 挂掉之后再重启数据可以进行恢复
9.1.7 事务
9.1.8 缓存雪崩, 缓存穿透
9.1.9 并发竞争 Key 问题
9.1.10 如何保证缓存与数据库双写时的数据一致性
- https://blog.csdn.net/chang384915878/article/details/86756463
- https://www.jianshu.com/p/a9bbcd3ec1e5
9.1.11 分布式锁
9.2 消息队列
9.2.1 什么是消息队列?为什么要用消息队列?
9.2.1 使用消息队列带来的一些问题
9.2.3 常见消息队列
9.2.3.1 RabbitMQ
9.2.3.2 常见消息队列对比
- https://blog.csdn.net/myhes/article/details/83247108
- https://www.cnblogs.com/xifengxiaoma/p/9391647.html
9.2.4 JMS
9.2.4.1 基本
- JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。
- https://www.cnblogs.com/molao-doing/articles/6557305.html
- 看到2.4即可
9.2.4.2 JMS两种消息模型
9.2.4.3 JMS五种消息类型
- TextMessage, 传String
- BytesMessage, 传byte[]
- MapMessage, 传Map
- StreamMessage, 传消息流
- ObjectMessage, 传可序列化对象(Serializable)
9.3 ZooKeeper
9.4 RPC
9.4.1 基本
9.4.2 原理
9.4.3 Dubbo
9.4.3.1 什么是Dubbo
- Dubbo是一个分布式服务框架
9.4.3.2 为什么要使用Dubbo
- Dubbo实现了RPC, 且提供分布式支持
9.4.3.3 Dubbo 工作原理
- 通过Zookeeper找到所有Dubbo节点,然后通过负载均衡选择某一个节点进行操作
9.4.3.4 负载均衡
9.4.3.5 ZooKeeper宕机与dubbo直连的情况
- 有两种连接方式, 一种是直连, 直接指定dubbo节点的地址, 一种是zookeeper, 使用负载均衡选择dubbo节点
- 如果zookeeper挂了, 可以通过本地缓存继续提供服务
9.5 布隆过滤器
9.6 分布式一致性
- https://www.cnblogs.com/mayundalao/p/11798502.html
- https://zhuanlan.zhihu.com/p/25933039?from_voters_page=true
- Poxos
- Raft
10 算法
- All Algorithms implemented in Java
- All Algorithms implemented in Python(不用看)
- https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in-2018/
- https://github.com/MisterBooo/LeetCodeAnimation
- https://zhuanlan.zhihu.com/p/85197826
10.1 数据结构
10.2 基本类型
- 递归
- 分治
全排列、二分搜索、归并排序、快速排序、线性时间选择、最接近点对问题
- 动态规划, 备忘录方法
矩阵连乘问题、最长公共子序列问题、0-1背包问题
- 贪心
活动安排问题、背包问题、装载问题、哈夫曼编码、单源最短路径、最小生成树问题
- 回溯法
n后问题、0-1背包问题、旅行售货商问题
- 分支限界法
0-1背包问题、旅行售货商问题
10.3 常见问题
- 常见的排序算法, 及其空间时间的复杂度
- 查找值范围在[x,y]的乱序的n个数字当中唯一”出现2次”的数字(空间换时间)
- 二叉树的深度和广度遍历(最好是非递归)(队列和栈的使用)
- 找出二叉树上两个距离最远的节点
- 数组的全排列(递归)
- 计算一个数字的N次幂
- 海量数据的Top N(堆的使用)
- 生产者消费者代码
- 阻塞队列实现
- 线程间通信
- 完全二叉树的节点个数(完全二叉树的理解)
- 将一个正整数拆成n个数之和, 使得积最大(动态规划)
- 求一个字符串的最大无重复子串(动态规划)
- 找出一个int数组中, 乘积最大的连续子数组, 数组值包含正负
- 找出最长上升子序列(不需要连续), 得出最长值就可以
- 现有每只股票的跌涨数据, 请设计算法找出涨幅最高的十只股票(Top N)
- 现在中意n支股票, 现投顾手中共有用户的资产为m元, 投顾只想每支股票最多买一支, 且买到的股票总价格正好为m元。请你设计算法, 判断投顾能不能成功(背包问题, 动态规划)
- 最大回撤率
- 最大回撤: 在某一段时期内产品净值从最高点开始回落到最低点的幅度
- 最大回撤率: $max (Di-Dj) / Di$ $(i < j)$
- 求最大回撤率, O(n)
11. 系统设计
11.1 业务系统核心架构图
11.2 如何保证DB和缓存的一致性
11.3 缓存使用的关注点
11.4 设计一个高吞吐量的系统
11.5 微信发红包设计方案
11.6 限流, 降级, 高可用, 容灾, 水平扩容等
11.6.1 限流, 降级
11.6.2 高可用
11.6.3 容灾, 水平扩容
11.7 负载均衡
11.8 一致性哈希的原理
11.9 分布式事务
- CAP
- C:Consistency,一致性,所有数据变动都是同步的。
- A:Availability,可用性,即在可以接受的时间范围内正确地响应用户请求。
- P:Partition tolerance,分区容错性,即某节点或网络分区故障时,系统仍能够提供满足一致性和可用性的服务。
- 看到三.1就行了