基于自己总结的一些java知识点
java
集合
Collection
List
ArrayList
linkedList
Vector
数组,适合查找,线程不安全,需要使用collections.synchronizedlist
链表,适合修改,线程不安全,需要使用collections.synchronizedlist
数组,线程安全
Set
HashSet
linkedHashSet
双向链表,保证唯一
TreeSet
使用Hashcode数组存储,无序
二叉树保证有序
Map
HashMap
linkedHashMap
双向链表,便于维护
HashTable
SortedMap
TreeMap
红黑树,对key做了排序,便于查找
线程安全
线程不安全
类加载器
加载机制
全盘负责
双亲委派
执行顺序,先父后子,先静态
缓存机制
类加载器加载时会首先寻找父类加载器加载
类相关依赖类都会需要类加载器加载
类加载后会放入缓存,所以修改class需要重启jvm,文件删除不影响程序运行
加载器类型
根加载器
扩展类加载器
系统类加载器
自定义类加载器
比如rt.jar
会加载扩展类路径下的包
会加载系统指定classpath下的包
系统类加载器是其父类
垃圾回收
收集垃圾
引用计数法
根源回溯法
从所有有效对象寻找根源,将除此以外的清除
每次引用都会给对象标记加一,释放引用就减一,最后一直为0的清除
回收垃圾
标记清除法
复制法
引用整理法
分代回收
适合新生代
适合老年代
先新生代,后老年代和永久代
异常处理
Throwable
Error
OutOfMemoryError
StackOverFlowError
NoClassDefFoundError
Exception
编译时异常
ClassNotFoundException
运行时异常
NullPointException
IndexOutOfBoundsException
ClassCastException
jvm
程序计数器
栈
本地栈
方法区
堆
新生代
伊甸园区
存活区1
存活区2
老年代
YGC
FGC
负责控制CPU的调度前后,程序的运行位置
每个方法一个栈帧,指向对应的常量表、操作数
本地方法的栈
存储每个类的信息,常量,静态变量,静态方法区,代码
存储所有对象和数组
多线程
创建线程
继承Thread类
实现runnable接口
使用callable和Future创建线程
使用Execute创建线程池
线程状态
new
runnable
blocked
waitting
longtime waitting
terminated
创建,还没开始start
阻塞,等待资源
停止等待,等待唤醒
运行中
超时等待,一段时间后自行唤醒
停止
线程类型
用户进程
普通系统、项目执行时的任务
守护进程
一直在后台执行,等待用户任务执行完成才会退出的,比如垃圾回收线程
线程池
复用线程,减少创建开销
利用已有线程,提高速度
线程有最大值和等待队列,避免大量请求,方便管理
处理流程
1.判断核心线程数是否满 没满就创建 ,满了就判断工作队列满不满
2.工作队列满了 就交由饱和策略处理,没满 就创建工作线程 并等待
设计模式
单例模式
RuntimeException
确保只有一个实例,全局唯一
装饰者模式
BufferedReader装饰inputStreamReader 读一个字符变成读一行字符
适配器模式
InputStreamReader转换FileInputString读字节变成读字符
改变作用
代理模式
权限过滤器
工厂模式
一个产品体系的封装,可以抽象出最高层次的产品
创建对象时有更高层次的封装
策略模式
产品的具体封装,需要客户端的数据
客户端来创建具体不同的对象
分布式事务
实现方法
2pc
增加协调
3pc
tcc
业务事务
本地业务表
消息队列
最大努力通知
锁
synchronized
同步锁
锁住整个对象
jdk7以后优化了,增加了cas
retranklock
可重入锁
避免死锁
偏向锁
非公平锁
CAS
自旋锁
ABA问题,用版本号解决



