Java知识体系
2021-03-26 19:34:14 313 举报
AI智能生成
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、安全性高等特点。Java知识体系包括Java基础语法、面向对象编程、异常处理、多线程编程、网络编程、数据库操作等方面。Java基础语法是学习Java的第一步,包括数据类型、运算符、流程控制语句等。面向对象编程是Java的核心特性之一,包括类、对象、继承、封装、多态等概念。异常处理能够帮助程序员更好地处理程序中出现的错误。多线程编程能够让程序同时执行多个任务,提高程序的效率。网络编程和数据库操作能够让程序与互联网和数据库进行交互。
作者其他创作
大纲/内容
spring
spring framework
spring bean
spring bean生命周期
配置方式
xml配置
接口注入
setter注入
构造器注入
工厂方法
静态工程方法
注解配置
Java配置
生命周期
作用域
singleton
prototype
request
session
global-session
自动装载方式
no
byName
byType
constructor
autodectect
自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
@Autowired
容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会
在IoC容器自动查找需要的bean,并装配给该对象的属性。
在IoC容器自动查找需要的bean,并装配给该对象的属性。
1.查找对应类型的Bean
2.通过类型查找有多个,则根据名字查找
3.如果都找不到抛出异常
解决办法:required=false
IOC
AOP
基本概念
事务
分类
申明式事务
编程式事务
传播行为
require
require_new
supports
not_supports
never
nested
mandatory
隔离级别
允许脏读
读已提交
可重复度
序列化
五种标准事件类型
上下文开始事件
上下文停止事件
上下文关闭事件
上下文更新事件
请求处理事件
自定义事件
循环依赖解决方式
构造器注入方式无法处理
setter等属性注入方式
三级缓存机制解决
singleton factories cache
存储实例化,还未初始化完成,还未引用的bean
early singleton objects cache
存数实例化,还未初始化完成,但被引用的bean
singleton objects cache
spring mvc
前端控制器
处理器映射器
处理器适配器
参数封装,数据格式转换,数据验证等操作
处理器
视图解析器
视图
spring boot
spring cloud
Eureka
Ribbon
负载均衡策略
轮询(默认)
最低并发策略(BestAvailableRule)
逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
可用过滤策略(AvailabilityFilteringRule)
过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server
区域权重策略(ZoneAvoidanceRule)
复合判断server所在区域的性能和server的可用性,来选择server返回
随机策略(RandomRule)
重试策略(RetryRule)
在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server
轮询策略(RoundRobinRule-默认策略)
轮询选择, 轮询index,选择index对应位置的Server,当轮询10还未合适的则不在轮询,直接结束
响应时间加权策略(ResponseTimeWeightedRule)
server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低
Feign
Hystrix
Zuul
Gateway
Sleuth
Zipkin
dubbo
核心组件
注册发现流程
Monitor原理
注册中心
负载均衡策略
容错策略
支持的协议
支持的序列化方式
服务降级方式
管理界面
代码Mock实现
集成第三方,如Hystric
消息中间件
常见问题及解决方案
消费的顺序问题
一个队列,一个消费者
从业务层面保证,不需要顺序的业务场景更多
重复消费问题
保证消息的幂等
消息挤压解决方案
增加服务消费
临时紧急扩容
消息过期
主流消息中间件
rabbitMQ
术语
broker
vhost
exchange
类型
direct
fanout
topic
header
备用交换器
死信队列交换器
binding
routing key
queue
临时队列
自动删除队列
单消费队列
自动过期队列
持久队列
producer
consumer
channel
消息
持久化
过期
消息持久化
消息过期
消息发送方式
单发送
失败通知
事物
发送确认
消费方式
推送方式Consume
拉取方式Get
批量确认方式Qos
消息拒绝策略
Reject
Nack
工作模式
单消个消费模式
点对点
work资源竞争
多消费模式
发布订阅模式
Routing路由模式
TOPIC主题模式
RPC
集群模式
主备模式
普通集群模式
镜像集群模式
远程模式
多中心模式
rocketMQ
术语
name service
provider
consumer
consumer group
broker
topic
queue
tag
消息
sharding key
分区ID
消费者消费方式
消费者消费模式
消息过滤
Tag过滤
SQL92过滤方式
回溯消费
事务消息
延迟队列(定时消息)
消息重试(消费失败)
消息重头
流量控制
生产者流控
消费者流控
死信队列
集群部署
文件系统
CommitLog
ConsumeQueue
IndexFile
页面缓存与内存映射
消息查询
过期消息清理
kafka
术语
Broker
Topic
Partition
Producer
Consumer
Consumer Group
Leader
Follower
segment文件
ISR列表
producer路由
指定partition,则使用指定partition
未指定partition,指定key,则通过key hash
partition和key都未指定,则使用轮询算法
消费方式
拉取
逐条拉取
批量拉取
消息持久化策略
leader和所有follower均持久化
leader持久化,follower接收到消息
数据库
mysql
mongoDB
netty
分布式事物
基本理论
CAP理论
CP
AP
BASE理论
解决方案
两阶段解决方式
XA协议
TCC
saga
本地消息表
可靠消息队列
常见框架
seata
TX-LCN
hmily
ByteTcc
TCC-transcation
easy transcation
Java
底层原理
JVM
内存模型
方法区(永久代)【jdk1.7及之前】
运行时常量池
类型信息
方法信息
字段信息
类加载器引用
Class实例引用
元空间【jdk1.8之后】
堆
年轻代
eden
from survivor
to survivor
老年代
虚拟机栈
本地方法栈
程序计数器
垃圾回收
回收算法
标记回收
复制清除
标记整理
分代回收算法
垃圾回收器
serial
praNew
parallel scavenge
serial old
parallel old
CMS
G1
判断可回收方法
引用计数
可达性分析
GC Roots
对象引用类型
强引用
软引用
若引用
虚引用
对象创建
创建对象的方式
new
clone
反序列化
反射
Class类的newInstance
(调用构造方法)
(调用构造方法)
Constructor的newInstance
(调用构造方法)
(调用构造方法)
流程
加载类文件
内存分配
分配方式
指针碰撞
空闲列表
并发问题处理
CAS失败重试
本地线程分配缓存
初始化内存
执行初始化方法
类加载机制
类文件装载方式
(动态加载)
(动态加载)
隐式加载
new
显示加载
Class.forname
类加载器
启动类加载器
扩展类加载器
引用类加载器
其他自定义加载器
类加载机制
全盘负责
父类委托
缓存机制
类加载过程
装载
连接
校验
文件格式校验
元数据校验
字节码校验
符号引用校验
准备
解析
初始化
双亲委派模型
JVM调优
常用调优工具
常用调优参数
class文件
类版本、接口、字段、方法
常量池
字面量
符号引用
编译原理
源文件编译为class文件
class文件解释为机器码执行
JIT
热点检测
基于采样的方式
基于计数的方式
编译器优化
逃逸分析
同步省略(消除锁)
标量替换
栈上分配
公共子表达式消除
数组范围检查消除
方法内连
Java对象组成
java对象头
mark word
无锁
hash Code
分代年龄
是否偏向锁:0
锁标识:01
偏向锁
线程ID
时间戳
分代年龄
是否偏向锁:1
锁标识:01
轻量锁
栈中锁记录指针
锁标识:00
重量锁
指向monitor的指针
锁标识:10
垃圾回收
锁标识:11
指向Class的指针
数组长度(只有数组才有)
实例数据
对齐填充字节
对象的内存大小应该是8bit的倍数
异常
(Throwable)
(Throwable)
Error
(错误)
(错误)
VitulMachineError
StackOverFlowError(堆栈溢出)
当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误
OutOfMemoryError(内存不足)
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误
AWTError
LinkageError
NoClassDefFoundError
IncompatibleClassChangeError
IllegalAccessError(违法访问错误)
当试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。
InstantiationError(实例化错误)
当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.
Exception
(异常)
(异常)
受检查异常
(非RuntimeException均是受检异常)
(非RuntimeException均是受检异常)
ClassNotFoundException
1.根绝指定路径没有找到指定类;
2.该类已被加载。
2.该类已被加载。
IOException
EOFException
FileNotFoundException
受检异常
ReflectiveOperationException
ClassNotFoundException(找不到类)
试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
InstantiationException(实例化异常)
当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常
NoSuchFieldException(属性不存在异常)
当访问某个类的不存在的属性时抛出该异常
NoSuchMethodException(方法不存在异常)
当访问某个类的不存在的方法时抛出该异常
RuntimeException
(不受检异常)
(不受检异常)
NullPointException(空指针)
ArithmeticException(算术条件异常)
IndexOutOfBoundsException(索引越界)
StringIndexOutOfBoundsException(字符串越界)
ArrayIndexOutOfBoundsException(数组越界)
ClassCastException(类转换异常)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
IO操作的BufferOverflowException异常
IllegalArgumentException
NumberFormatException(数字格式异常)
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常
集合
Collection
Queue
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
Dqueue
双端队列
List
(有序)
(有序)
ArrayList
Object数组
每次扩容只会增加50%
多线程环境下,Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用
LinkedList
双向循环链表
Vector
Stack
每次扩容增加1倍
Set
(无序)
(无序)
HashSet
(无序,唯一)
(无序,唯一)
基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkdeHashSet
LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。
SortedSet
NavigableSet
TreeSet
(有序,唯一)
(有序,唯一)
红黑树(自平衡的排序二叉树。)
Map
HashTable
数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
比HashMap多个线程安全,已不建议使用
null不能作为键
HashMap
JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).
JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间
JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间
Hash计算方式
1.hashCode()计算哈希码
2.扰动处理
(减少哈希冲突)
(减少哈希冲突)
JDK7
扰动处理:9次扰动=4次位运算+5次异或运算
JDK8
扰动处理:2次扰动=1次位运算+1次异或运算
Put方法具体流程
计算KKey的Hash值
让key.hashCode() 与key.hashCode()>>16 进行异或操作
高16bit补0,一个数和0异或不变,
所以 hash 函数大概的作用就是:高16bit不变,低16bit和高16bit做了一个异或,目的是减少碰撞。
因为bucket数组大小是2的幂,计算下标index = (table.length - 1) & hash ,
如果不做 hash 处理,相当于散列生效的只有几个低 bit 位,为了减少散列的碰撞,
设计者综合考虑了速度、作用、质量之后,使用高16bit和低16bit异或来简单处理减少碰撞,
而且JDK8中用了复杂度 O(logn)的树结构来提升碰撞下的性能。
高16bit补0,一个数和0异或不变,
所以 hash 函数大概的作用就是:高16bit不变,低16bit和高16bit做了一个异或,目的是减少碰撞。
因为bucket数组大小是2的幂,计算下标index = (table.length - 1) & hash ,
如果不做 hash 处理,相当于散列生效的只有几个低 bit 位,为了减少散列的碰撞,
设计者综合考虑了速度、作用、质量之后,使用高16bit和低16bit异或来简单处理减少碰撞,
而且JDK8中用了复杂度 O(logn)的树结构来提升碰撞下的性能。
每次扩容为原来的2倍
,resize()方法表示的在进行第一次初始化时会对其进行扩容,或者当该数组的实际大小大于其临界值(第一次为12),这个时候在扩容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,
在1.7中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,
但在1.8版本中,则是根据在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上
在1.7中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,
但在1.8版本中,则是根据在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上
初始大小16(2的四次方)
为啥长度为2的幂次方
让 HashMap 存取高效,尽量较少碰撞,
也就是要尽量把数据分配均匀,每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。
也就是要尽量把数据分配均匀,每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。
算法
取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率
两次扰动
加大哈希值低位的随机性,使得分布更均匀
最终减少Hash冲突,两次就够了,已经达到了高位低位同时参与运算的目的;
最终减少Hash冲突,两次就够了,已经达到了高位低位同时参与运算的目的;
键值都可以为null
LinkedHashMap
(保证插入顺序)
(保证插入顺序)
继承自 HashMap,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序
ConcurrentHashMap
对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护
键值都不允许为null
① 在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。(默认分配16个Segment,比Hashtable效率提高16倍。)
JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。
JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。
IdentityHashMap
SortedMap
NavigableMap
TreeMap
红黑树(自平衡的排序二叉树)
WeakHashMap
线程
基本概念
五个基本状态
可运行
运行
等待锁
等待队列(已释放锁,等待被唤醒,唤醒后进入“等待锁”状态)
其他等待状态(释放处理器,不释放锁,结束之后进入可运行态)
内存屏障
读屏障(Load Barrier)
写屏障(Store Barrier)
缓存一致性问题
缓存一致性协议(MESI)
总线锁
线程调度
依赖系统调度
调度策略
分时调度
平均分配CPU时间
抢占调度
优先级高的线程先执行
锁
死锁的四个条件
互斥性
只能被一个线程获取锁
请求保持
获取到锁之后没有释放
不可剥夺
获取到的锁,不能被外在剥夺
相互等待
多个线程循环等待
CAS
Java线程
创建线程的方式
thread
runnable
callable
线程池
基本方法
sleept
wait
notify、notifyAll
yield
并发关键字
synchronized
volatile
AQS
同步容器/并发容器
并发工具
CountDownLatch
cyclicBarriery
semaphore
exchanger
fork join 框架
LockSupport
原子操作类(Atomic*)
线程池
存在的状态
Running
Shutdown
不接受新任务,会继续处理队列中的任务
Stop
终止正在执行的任务,不处理队列任务,不接收新任务
Tidying
执行terminated方法:这是一个空方法,可以自己继承实现,用户线程结束之后,处理业务
Terminated
核心参数
corePoolSize
maxnumPoolSize
workQueue
keepAliveTime
unit
threadFactory
handler
饱和策略
AbortPolicy(默认使用方式)
抛出 RejectedExecutionException 来拒绝新任务的处理。
CallerRunsPolicy
当最大池被填满时,此策略为我们提供可伸缩队列
DiscardPolicy
不处理新任务,直接丢弃掉
DiscardOldestPolicy
此策略将丢弃最早的未处理的任务请求。
持久层框架
mybatis
优缺点
延迟查询
仅支持关联类型(嵌套)查询的延迟加载
原理
使用CGLIB创建对象的代理对象
缓存
一级缓存
默认开启
基于session会话的缓存
二级缓存
基于namesapce的缓存,默认未开启
动态SQL
参数处理
自定义实现paramHandler类映射参数
支持的插件
executor
paramterHandler
resultSetHandler
statementHandler
执行器
SimpleExecutor
ReuseExecutor
BatchExecutor
like查询的处理
主键生成方式
MappedStatement对象
架构
API接口层
数据处理层
SQL解析
参数映射
SQL执行
结果集映射
基础支持层
事物管理
连接池管理
缓存管理
引导层
基于xml配置方式
基于注解配置方式
hibernate
zookeeper
ZAB协议
集群选主
权限控制
Znode数据结构
data
state
child引用
ACL
节点分类
watch工作原理
redis
优缺点
速度快的原因
基于内存
数据结构简单
单线程设计
多路IO复用
自定义VM模型
数据类型
基本数据类型
string
list
hashMap
set
Zset
特殊数据类型
bitMap
hyperloglog
geospatital
pub/sub
stream
底层数据结构
SDS
字典(相当于hash)
跳跃表
压缩表
快速列表
持久化方式
RDB
AOF
分区方案
客户端分区
代理层分区
查询路由
分布式锁
setnx
redlock
缓存问题
缓存雪崩
缓存穿透
缓存击穿
缓存预热
缓存降级
过期策略
定期过期
定时过期
惰性过期
淘汰策略
线程模型
事务(弱事务)
集群
主从架构
哨兵集群
分布式集群
分布式寻址算法
客户端分配
代理服务器分片
客户端工具
redisson
jedis
lettuce
其他
大批量数据的处理方式pipe 模式
查看指定模式的key
keys指定
scan指令
elastic search
设计模式
常见网络攻击及防护
xss
分类
反射型XSS
存储型XSS
防护
1.过滤。对诸如<script>、<img>、<a>等标签进行过滤。
2.编码。像一些常见的符号,如<>在输入的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。
xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。
crsf
漏洞检测
简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
防御
验证 HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站
缺点
Referer 的值是由浏览器提供的,把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全
Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权.
用户自己可以设置浏览器使其在发送请求时不再提供 Referer。网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。
用户自己可以设置浏览器使其在发送请求时不再提供 Referer。网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。
在请求地址中添加 token 并验证
在cookie之外增加token参数校验
缺点
难以保证 token 本身的安全
在 HTTP 头中自定义属性并验证
缺点
局限性非常大
0 条评论
下一页