java集合
分为两类:
一、Collection:
1、List:
(1)ArrayList:底层使用数组;元素排列有序可重复;线程不安全;查询快,插入删除慢;初始化容量为10,当容量不够时,默认扩展 old+(old>>1)
(2)Vector:底层使用数组;元素排列有序可重复;线程安全(效率低);查询快,插入删除慢;当容量不够时,默认扩展一倍的容量
(3)LinkedList:底层使用双向循环链表;可重复;查询慢、插入删除快;线程不安全
2、Set:
(1)HashSet:内部使用HashMap,元素无序不可重复,存取速度快,put(元素,new Object())
(2)TreeSet:内部使用TreeMap的SortedSet(二叉树实现),排列无序不可重复,
(3)LinkedHashSet:采用Hash表存储,并用双向链表记录插入的顺序,内部使用LinkedHashMap。双向链表+HashMap=LinkedHashMap落地存储在HashMap,
3、Queue:使用链表实现,线程安全
二、Map
1、HashMap:允许key、value为null;线程不安全
2、HashTable:key、value都不能null,线程安全
3、TreeMap:二叉树(红黑树)
ArrayList和LinkedList初始化容量和扩容,物理和逻辑上
ArrayList初始化容量为10,再添加第十一个元素的时候,会对数组进行扩容,扩容的容量为10+10>>1=15。
LinkedList初始化容量为0,在每次新增元素时,根据调用不同的方法往链表尾部或者链表头部无限制的增加节点。
spring bean的生命周期?
1、扫描包生成BeanDefinition:筛选并解析配置类(@Component、@ComponentScan、@Import、@ImportResource),如果是@ComponentScan注解类执行扫描逻辑,将解析到的类封装为BeanDefinition注册到BeanFactory中。
2、合并BeanDefinition:合并父子依赖的BeanDefinition,原有的不变,重新生成RootBeanDefinition,他就是合并父子BeanDefinition,子覆盖父。
3、加载BeanDefinition:
4、实例化前:执行BeanPostProcessor#before()方法
5、推断构造方法:
6、实例化:doCreateBean():如果有supplier则用它创建对象,如果没有则通过构造方法反射创建对象。 `
7、BeanDefinition后置处理器:对BeanDefinition进行加工----spring对外提供的拓展点
8、实例化后:执行BeanPostProcessor#after()方法---拓展点
9、属性填充:找到属性注入点(是否由@Value、@Autowired、@Inject注解),找到所有这些注解修饰的方法,对这些属性和方法进行注入
10、执行Aware回调:判断bean是否实现了Aware接口,调用相关的set()方法
11、初始化前:执行BeanPostProcessor#beforeInitialization();执行@PostConstruct注解的方法
12、初始化:如果bean实现了InitializationBean则执行afterPropertiesSet();使用xml配置initMethod直接反射;直接使用BeanDefinition设置initMethod直接反射
13、初始化后:判断是否开启了aop,生成对应切面bean的代理对象。
14、bean销毁:如果bean为单例则注册一个
spring事务
在spring boot项目开启@EnableTransactionManagement注解表示,开启事务,会向spring容器中导入事务相关的Advisor bean,其中pointcut为方法或者bean加了@Transaction注解,advice执行开启事务创建连接设置隔离级别,提交或者回滚事务逻辑以及异常处理。spring启动时在执行初始化后的逻辑中,会从beanFactory中找到所有Advisor,如果属于PointCutAdvisor类型,继续判断目标类或者目标方法存在@Transaction注解,是则对bean进行aop创建代理对象,代理逻辑为advice中。
spring事务如何在一个事务基础上创建新事物
1、事务管理器创建事务并设置事务隔离级别,异常捕获机制,超时时间等参数
2、在将要执行sql时创建连接
3、自动提交设置false
将连接设置到ThreadLocal<dataSource,Connection>中
4、执行方法(可能多个sql)
调用其他方法需要创建新的事务,将当前线程资源挂起缓存到挂起资源对象中,再去创建新的事务执行完sql后提交或者回滚后,恢复现场将挂起资源对象中属性重新设置到当前线程中去。
5、回滚或者提交
6、关闭连接