JAVA
2021-01-11 11:46:48 0 举报
AI智能生成
java的一些知识点
作者其他创作
大纲/内容
JAVA基础
集合
List
ArrayList
ArrayList数组,线程不安全,初始容量10,扩容机制(1.5倍)
Vector
与ArrayList一样,但它是线程安全的(synchronize在方法上修饰),扩容机制(2倍)
LinkedList
双向链表,线程不安全
Map
HashMap
底层结构
数组+链表,1.8之后数组+链表+红黑树(链表长度达到8之后链表转为红黑树)
线程不安全
HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是resize,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的
扩容机制
达到阈值后(0.75),触发扩容(2倍),1.7之前先扩容后插入,1.8之后先插入后扩容
链表插入方式
1.7头插入(易发生闭环)
1.8尾插入
TreeMap
有序的,key值升序(不允许key为null)
LinkedMap
有序的,插入顺序(key与value都可为null)
ConcurrentHashMap
线程安全
segment实现ReentrantLock
1.7 使用segment进行分段,加锁
1.8使用Node+CAS+Synchronized
PUT方法:如果Node还未初始化,那么通过CAS插入相应的数据;
如果Node不为空,且当前该节点不处于移动状态,那么对该节点加synchronized锁,如果该节点hash不小于0,则遍历链表更新节点或者插入新节点;
如果该节点是TreeBin类型的节点,说明是红黑树结构,则通过putTreeVal方法往红黑树中插入节点;
如果binCount不为0,说明put操作对数据产生了影响,如果当前链表的个数达到8个,则通过treeifyBin方法转化为红黑树,如果oldVal不为空,说明是一次更新操作,没有对元素个数产生影响,则直接返回旧值;
如果插入的是一个新节点,则执行addCount()方法尝试更新元素个数baseCount;
如果Node不为空,且当前该节点不处于移动状态,那么对该节点加synchronized锁,如果该节点hash不小于0,则遍历链表更新节点或者插入新节点;
如果该节点是TreeBin类型的节点,说明是红黑树结构,则通过putTreeVal方法往红黑树中插入节点;
如果binCount不为0,说明put操作对数据产生了影响,如果当前链表的个数达到8个,则通过treeifyBin方法转化为红黑树,如果oldVal不为空,说明是一次更新操作,没有对元素个数产生影响,则直接返回旧值;
如果插入的是一个新节点,则执行addCount()方法尝试更新元素个数baseCount;
size方法
1.7 没有加锁,多次计算(最多3次,如果前两次统计一样则返回,否则给每个segment加锁,在计算一次)
1.8 使用volatile的baseCount统计数
HashTable
与hashMap类似(key与value都不能为null),但它是线程安全,但是效率低,一般不用
Set
HashSet
无序
TreeSet
有序
多线程
JUC并发包
Volatile关键字
线程之间的可见性,不保证变量的原子性
CAS算法
一种无锁的非阻塞算法,是硬件对于并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问;
并发容器
ConcurrentHashMap
CountDownLatch闭锁
锁
读写锁ReadWriteLock
同步锁Synchronize
Lock
ReentrantLock(重入锁)
线程池
ThreadPoolExecutor
参数
最大线程数maxSize
空闲保持时间keepAliveTIme
时间单位TIMEUNIT
等待队列
SynchronousQueue
直接提交,没有容量
ArrayBlockingQueue
有界的任务队列,可以设定一个具体的容量
PriorityBlockingQueue
优先任务队列,无界限,可以控制优先级
LinkedBlockingQueue
无界限的任务队列,容量很大
线程工厂
拒绝策略
AbortPolicy
直接抛出异常
CallerRunsPolicy
只要线程池未关闭,该策略直接调用线程,运行当前丢弃的任务
DiscardOlestPolicy
丢弃最老的任务
DiscardPolicy
默默不做任何操作
核心线程数coreSize
四种线程池
固定线程数newFixedThreadPool
可以控制线程数,但有无受限制的链表队列存储等待队列,如果数量剧增,业务处理不过来,导致链表剧增,从而导致内存溢出
单线程池newSingleThreadPool
实现与fixed一样,就是最大线程设置为1,存在的意义大概就是可以作为一个任务队列
缓存线程池newCachedThreadPool
创建大量线程,导致内存溢出
计划线程池newScheduledThreadPool
Spring封装的线程池ThreadPoolTaskExecutor
创建方式
继承Thread
实现Runnable
实现Callable
Future接收返回值
线程状态
新建
就绪
运行
阻塞
停止
字符串
String
不可变,在常量池,线程安全
StringBuffer
可变,线程安全(同步锁)
StringBuilder
可变,线程不安全
数据库
MySQL数据库
索引
hash
个人认为主键可以用HASH,HASh值唯一,查询重复的数据将失效
B+Tree
单一索引
联合索引
左匹配原则
优化
Explain
id:每个被独立执行的操作标志
select_type:查询中每个select子句的类型
table:被操作的对象名
partitions:匹配的分区信息
type:join类型
possible_keys:列出可能会用到的索引
key: 实际用到的索引
key_len:用到的索引键的平均长度,单位字节
ref: 表示本行操作的对象的参照对象
rows:估计每次需要扫描的行数
filtered:rows*filtered/100 表示最后的行数
extra:重要的补充信息
profile
用来分析SQL性能的消耗分布情况
慢SQL查询
1、建立合适的索引
2、尽量不在SQL做计算操作
事务隔离级别
读未提交数据
读已提交数据
解决脏读
可重复读
解决脏读、不可重复读
可串行化
解决脏读、不可重复读、幻读
锁
表级锁
行级锁
MVCC
数据类型
存储钱类型
decimal
对应的java类型的使用bigdecimal
numeric
char与varchar
空间
char是固定的,定义char[10]就是10个字符
varchar是不固定的,定义varchar[10],如果存2个字符就是2个字符空间
速度:char要比varchar快,char不要考虑空间问题
char英文占用1个字节,一个汉字占用2字节,varchar都是占用2个字节
Sqlite数据库
文件数据库
NoSQL
Redis
中间件
RabbitMQ
消息可靠
生产者到MQ
事务机制
ack应答机制
MQ
持久化
RDB,快照
AOF,文件追加
MQ到消费者
将自动确认改为手动确认,在没有返回确认信息时,MQ中的信息时一个中间状态,并不会删除
部署
单一
普通集群
镜像集群
核心组件
AMQP核心组件
交换机
队列
绑定
java核心组件
ConnectionFactory
Connection
Channel
Delivery
DeliverCallback
CancelCallback
适用场景
解耦
最终一致性
广播
错峰与流控(秒杀业务用于流量削峰场景)
Redis
数据类型
String
incr
+1
decr
-1
setnx
锁
Hash
List
Irange 可以分页
Set
ZSet
分布式锁
setNX
怎么使用的
set成功执行后面逻辑(set的时间,并开启一个线程更新时间以便在操作时间过长导致两个同时执行代码块),set不成功,获取不锁
持久化
RDB
快照
AOF
文件追写
部署
单一
集群
主从(哨兵)
其它
缓存击穿
击穿,没有命中Redis中的key值,也就是说在key失效的某一刻并发的同一个key来查询无果,大量的查询数据库情况
解决方案:加锁
缓存穿透
穿透,指Redis中的没有key,查询数据库返回的为null,大量的查询null,就像没有Redis一样
解决方案
将key值缓存起来,可能导致大量的null
只用布隆过滤器
布隆过滤器是有一定的容错率,但是不存在的就一定不错在,存在的不一定存在
缓存雪崩
雪崩,指大量的key失效,增大数据库的压力
解决方案:设置时间要均匀,比如设置2秒,后面加个随机数
框架
Spring
IOC
控制反转容器,也可以称为依赖注入,存放SpringBean
@Autowired
ByType
@Resource
ByType
ByName(默认)
反射机制
反转是指本该有调用者创建的对象,交给了Spring来创建与管理,IOC是一个容器,创建好的Bean在IOC的Map中
DI注入,简单的说就是拿到对象的属性
从IOC中获取Bean
根据ID
返回类型需要强转
根据Class
根据ID和类型的字节码返回不需要强转
创建的都是单例模式,减少了内存占用
加载过程
定位:定位配置文件以及配置信息
解析:解析信息
分析:
AOP
代理模式实现
动态代理模式
切面aspect,切点Pointcut,连接点Join Point,通知advice
运用场景
日志记录
权限验证
第三方介入验签
效率检查
事务管理
bean生命周期
1、实例化
2、设置属性
1、BeanNameWare 的 setBeanName()
2、BeanFactoryWare的 setBeanFactory()
3、ApplicationContextWare的setApplicationContext()
3、初始化
1、postProcessBeforeInitialization()
2、InitializingBean()--init-method()
3、postProcessAfterInitialization()
4、使用
5、销毁
destroy()
@Transaction
失效:捕获了异常
使用AOP 现实
Bean加载过程
1、获取BeanName
2、合并Bean定义,对父类的定义进行合并,获取完整的Bean定义
3、实例化,使用构造或工厂方法创建Bean实例
4、属性填充,寻找并且注入依赖,依赖的Bean
5、初始化,调用自定义的初始化方法
6、获取最终的Bean,如果是FactoryBean需要调用getObject()
循环依赖
三级缓存,其实就是三个Map,实例化完成的bean在一级缓存,在bean注入属性的过程中,如果需要注入一个没有创建完成的bean时,可以在二级和三级中的找已经实例化的对象,以不至于没有办法完成注入。
scope=“Protopart”原型无法解决循环依赖
构造器也无法解决循环依赖?@lazy
1、拿bean的时候先从singletonObjects(一级缓存)中获取
2、如果获取不到,并且对象正在创建中,就从earlySingletonObjects(二级缓存)中获取
3、如果还是获取不到就从singletonFactories(三级缓存)中获取,然后将获取到的对象放到earlySingletonObjects(二级缓存)中,并且将bean对应的singletonFactories(三级缓存)清除
4、bean初始化完毕,放到singletonObjects(一级缓存)中,将bean对应的earlySingletonObjects(二级缓存)清除
2、如果获取不到,并且对象正在创建中,就从earlySingletonObjects(二级缓存)中获取
3、如果还是获取不到就从singletonFactories(三级缓存)中获取,然后将获取到的对象放到earlySingletonObjects(二级缓存)中,并且将bean对应的singletonFactories(三级缓存)清除
4、bean初始化完毕,放到singletonObjects(一级缓存)中,将bean对应的earlySingletonObjects(二级缓存)清除
SpringMVC
SpringMVC流程
1、DispatcherServlet前端控制器
2、requestMapping找对应的handler
3、得到handler适配器,执行handler拦截器
4、执行handler逻辑处理返回modelandview
5、执行handler的post拦截器
6、根据modelandview得到view
7、渲染View返回
SpringBoot
自动配置
stater
启动过程
Mybatis
防止SQL注入
Mybatis启用了预编译的功能,在SQL执行前,先对数据库进行编译;执行时,直接使用编译好的SQL,替换占位符
预编译的底层原理就是JDBC中的preparedStatement
#与$
#,在SQL中转化为字符串,经过预编译
$,将值拼接到SQL语句上
MyBatis与Spring集成
shrio
核心组件
Authenticator,管理登录登出
Authorizer,管理权限
session Manager,session管理器
session Dao,session增删改查
Cache Manager,缓存管理器
ralems,与数据库交互
SpringCloud
SpringBoot
Feign
服务之间的调用
Ribbon
负载均衡
轮询
随机
最小活跃
哈希
加权轮询
Hystrix
熔断
被调服务故障或调用时间过长
进入熔断之后,hystrix有在一段时间之内半开状态,允许一部分调用服务,如果可以调且有返回值,则解除熔断
降级
是指资源紧张,系统要牺牲一部分性能
与feign一块,fallback与fallbackFactory
注册与发现中心
Nacos
Eureka
配置中心
config
apollo
Nacos
网关
Gateway
限流
权限
负载均衡
zuul
JVM
内存模型
堆
老年代 2/3
年轻代 1/3
eden 8
survivor 2
from 1
to 1
存放引用类型的对象,即new出来的对象、数组值、类的非静态成员变量值(基本数据类型)、非静态变量的引用
程序计数器
栈
对象的引用和基本类型
方法区
类信息、静态变量、常量池、类的版本号
本地方法栈
GC
major GC
full GC
频繁FullGC,原因
算法
标记-清除
标记-整理
复制
引用计数
优化
类加载
加载过程
1、加载
2、连接
验证
准备
解析
3、初始化
4、使用
5、销毁
双亲委派机制
启动类加载器
扩展类加载器
应用程序加载器
自定义加载器
好处:避免重复加载
内存溢出查找过程
WEB容器
Tomcat
Nginx
设计模式
单例模式
懒汉式
饿汉式
工厂模式
简单工厂模式
工厂方法模式
抽象工厂模式
代理模式
静态代理
动态代理
策略模式
适配器模式
类适配器
接口适配器
对象适配器
分布式
分布式事务
分布式锁
Redis
zookeeper
设计原则
单一职责原则
接口隔离原则
开闭原则
里氏替换原则
依赖倒置原则
0 条评论
下一页