JAVA知识梳理
2020-03-05 11:03:51 0 举报
AI智能生成
JAVA 面试相关知识汇总
作者其他创作
大纲/内容
集合类
Spring
事务的实现、传递性
优点
代码低侵入性
对象之间的依赖交于框架, 降低耦合
支持主流框架,自成体系
提供AOP服务, 更好的复用代码
Cglib
支持普通类
支持接口
JDK动态代理
不支持普通类
支持接口
Bean
生命周期
1.初始化Bean
2.属性依赖注入
3.aware接口
4.beanPostProcesser
5.init初始化方法<br>
6.使用Bean
7.销毁前方法
8.销毁
设计模式
工厂模式
BeanFactory
代理模式
Aop
单例模式
Bean默认为单例
观察者模式
定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。
微服务
拆分时机
业务痛点,并发, 迭代
可以进行灰度发布,不影响使用
数据库不会连表查询,如果过度偶尔则拆分不开
拆分条件
应用无状态
排序算法,时间、空间复杂度
类加载机制
IO流
数据结构
链表
链表reverse
二叉树
项目中的架构
前端<br>
Vue
Html
Ajax
运维
nginx分发
Docker
Zookeeper(cp原则)
持久化节点
PERSISTENT 持久化节点: 所谓持久节点,是指在节点创建后,就一直存在,直到 有删除操作来主动清除这个节点。否则不会因为创建该节点的客户端会话失效而消失。
持久化有序节点
PERSISTENT_SEQUENTIAL 持久顺序节点:这类节点的基本特性和上面的节点类 型是一致的。额外的特性是,在 ZK 中,每个父节点会为他的第一级子节点维护一份时序, 会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属 性,那么在创建节点过程中,ZK 会自动为给定节点名加上一个数字后缀,作为新的节点名。 这个数字后缀的范围是整型的最大值。 在创建节点的时候只需要传入节点 “/test_”,这样 之后,zookeeper 自动会给”test_”后面补充数字。
临时节点
EPHEMERAL 临时节点:和持久节点不同的是,临时节点的生命周期和客户端会 话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提 到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。 这里还要注意一件事,就是当你客户端会话失效后,所产生的节点也不是一下子就消失 了,也要过一段时间,大概是 10 秒以内,可以试一下,本机操作生成节点,在服务器端用 命令来查看当前的节点数目,你会发现客户端已经 stop,但是产生的节点还在。
临时有序节点
EPHEMERAL_SEQUENTIAL 临时自动编号节点:此节点是属于临时节点,不过带 有顺序,客户端会话结束节点就消失<br>
设计目的
最终一致性
client无论连接到那一台server,那么它得到的都是同样的视图,这是zookeeper最重要的性能
可靠性
简单、健壮、良好的性能,如果一个消息被一台服务器接受, 那么它将被所有的服务器接受
实时性
Zookeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或 者服务器失效的信息。但由于网络延时等原因,Zookeeper 不能保证两个客户端能同时得到 刚更新的数据,如果需要最新数据,应该在读数据之前调用 sync()接口。
等待无关(wait-free)
慢的或者失效的 client 不得干预快速的 client 的请求,使得每 个 client 都能有效的等待。
原子性
更新只有成功或者失败
顺序性
全局顺序
指如果在一台服务器上消息 a 在消息 b 前发布,则在所有 Server 上消息 a 都将在消息 b 前被发布
偏序
指如果一个消息 b 在消 息 a 后被同一个发送者发布,a 必将排在 b 前面。
Redis
支持数据格式
1.string:最基本的数据类型,二进制安全的字符串,最大512M。
2.list:按照添加顺序保持顺序的字符串列表。 2^32-1(4GB)
3.set:无序的字符串集合,不存在重复的元素。2^32-1(4GB)
4.sorted set:已排序的字符串集合。2^32-1(4GB)
5.hash:key-value对的一种集合。2^32-1(4GB)
穿透
指的是:访问不存在的key,导致直接穿透缓存,访问数据库
雪崩
指的是:存在redis中的key同一时间失效,导致流量全部访问数据库
限流, 降级, 本地ehcache缓存
击穿
缓存中的热点key突然失效, 原本走缓存的大量请求直接打向了数据库, 就好像在缓存中击穿了一个洞
1.在被查询的数据上加互斥锁, 这样其他的请求只能等待
内存优化
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.
持久层
mybatis
优点
手写sql灵活、高效
能够很好的集成spring
学习简单,半ORM框架
缺点
移植性差
sql能力要求较高
#{}和${}的区别是什么?
#{},是预处理,替换成? 使用PreparedStatement替换值
${} 直接替换值
druid
hibernate
消息队列
RabbitMq
全局搜索
Elasticsearch(ES)
多线程
线程池
SingleThreadExecutor
这 个 线 程 池 只 有 一 个 核 心 线 程 在 工 作 ,也 就 是 相 当 于 单 线 程 串 行 执 行 所 有 任 务 。如 果 这 个 唯 一 的 线 程 因 为 异 常 结 束 ,那 么 会 有 一 个 新 的 线 程 来 替 代 它 。 此 线 程 池 保 证 所 有 任 务 的 执 行 顺 序 按 照 任 务 的 提 交 顺 序 执 行
FixedThreadPool<br>
固定线程池:只 有 核 心 线 程 。 每 次 提 交 一 个 任 务 就 创 建 一 个 线 程 ,直 到 线 程 达 到 线 程 池 的 最 大 大 小 。线 程 池 的 大 小 一 旦 达 到 最 大 值 就 会 保 持 不 变 ,如 果 某 个 线 程 因 为 执 行 异 常 而 结 束 ,那 么 线 程 池 会 补 充 一 个 新 线 程 。<br>
CachedThreadPool
无边界线程池, 会回收空闲的的线程, 任务增加时也会新建线程(数量由JVM指定),通常用于短任务<br>
ScheduledThreadPool
核 心 线 程 池 固 定 , 大 小 无 限 的 线 程 池 。
volatile作用
线程间可见:当一个线程修改值后, 其它线程立即可见
禁止指令重拍
ReentrantLock与Synchronized<br>
特点:要么不占, 要么独占
reentrantLock<br>
优点
等待可中断
超时直接返回<br>
可判断是否有其他线程等待该锁
可实现公平锁
高竞争的情况下, 性能维持常态
缺点
不可以自动释放锁,需要手动unlock<br>
synchronized<br>
优点
JVM底层实现, 异常可自动释放锁
低竞争的情况下, 性能比renntrantLock要好
缺点
高竞争的情况下, 性能下降比较快
JUC
CountDownLatch
阻塞当前线程,等所有的线程都处理后, 在运行<br>
CyclicBarrier<br>
循环栅栏:主要调用await方法,每调用一次减一, 计数为0的时候, 解除阻塞;<br>
Semaphor
限制同一时间,访问资源的线程数量;aquire 获取许可, release 释放许可<br>
AQS(AbstractQuenedSynchronizer)<br>
构建同步锁的框架
数据库
最左侧原则
针对复合索引,先使用复合索引最前面的索引(精确查找),直到范围查找
簇拥索引与非簇拥索引
簇拥索引:数据和索引放在一起
非簇拥索引:数据与索引分开放
索引
hash索引
对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引;
Btree索引
B树
叶子节点存储多个元素(包含key和value)
B+树
叶子节点只存key, 非叶子节点存储值;
有序数组
有序数组在等值查询和范围查询场景中的性能都非常优秀。用二分法就可以快速找到(时间复杂度为O(logN))。但是如果要往中间插入一条数据,则必须挪动后面的所有记录,成本较高。因此,有序数组只适用于静态存储引擎,即数据表一旦建立后不再会修改。
innoDb
优点
支持事务
行级锁
索引组织表
存储方式
共享表空间存储
所有表的数据文件和索引文件都保存在一个表空间里,一个表空间可以有多个文件,通过innodb_data_file_path和innodb_data_home_dir参数设置共享表空间的位置和名字,一般共享表空间的名字叫ibdata1-n。
多表空间存储
以表名为文件名称存储
索引使用的是B+树
MyISAM
优点
支持 FULLTEXT类型的全文索引
缺点
不支持事务
不支持外键
不支持行级锁(只支持表级锁)
堆表
在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型
.frm 用于存储表的定义
.MYD 用于存放数据
.MYI 用于存放表索引
事务
原子性
持久性
一致性
隔离性
事务隔离
未授权读取,也称脏读,在数据修改的时候允许读取
授权读取,也称提交后读取
可重复读取:禁止不可重复读取和脏读取,但是有时可能出现幻读数据。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。可以通过“共享读锁”和“排他写锁”实现。
序列化:提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
幻读
针对多个数据
不可重复
针对单个数据
脏读
读取了另一个事务未提交的数据
设计范式
第一范式:所有的字段都是最小的, 不可拆分;例如 高级职称 可分为 教授与副教授(不符合第一范式)
第二范式:表中所有列都依赖于主键,也就是说一张表只描述一件事情
第三范式:数据不能存在传递关系,例如:学号,班级 就是属于传递
加密
对称加密
加密与解密都使用同一个秘钥,只有一个秘钥, 称为私钥
DES 算法
AES 算法
3DES 算法
非对称加密
加密与解密使用不同的秘钥,公钥和私钥(互为解密)
RSA
ECC
分布式架构
mysql 分库分表
CAP
Consistency(一致性)
Availability(可用性)
Partition tolerance(分区容错性)
虚拟机
Native方法栈
堆
java jvm栈
程序计数器
线程切换,CPU调度可以正确的回到原来的线程
方法区
类的信息, 以及static final 变量
垃圾回收算法
复制算法
标记清除
标记整理
dubbo
0 条评论
下一页
为你推荐
查看更多