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