Vector,ArrayList, LinkedList
- Vector、ArrayList类似数组存储在内存,LinkedList以链表。
- List元素有序、允许有重复的元素,Set元素无序、不允许有重复元素。
- Vector线程同步,ArrayList、LinkedList不同步
- LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作
- ArrayList元素填满容器时自动扩充容器大小的50%,Vector则是100% ArrayList更节省空间
HashTable, HashMap,TreeMap
hashTable线程同步,不能空值,使用enumeration,默认hash数组大小11,增加old*2+1
hashMap默认16,2的指数倍
treeMap键升序排序
class.forName与classLoader
forName类class加载jvm,解释类 执行类中的static块
classLoader加载到jvm,newInstance执行static块
Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序_java 父子类静态非静态加载顺序-CSDN博客
hashMap的put
key哈希算法与 与运算得出数组下标 为空key/value封装为entry对象/node对象
不为空:
jdk要扩容 扩容,不生成entry对象,头插法添加到当前位置的链表中
8 先判断node类型,红黑树 封装节点到红黑树中
链表 封装node尾插插入到最后位置,遍历链表 是否存在key 更新否新增,新增完链表节点是否大于8,是转成红黑树
key和value封装node插入到链表 红黑树 是否需要扩容
扩容:
新数组,遍历老数组每个位置上链表的每个元素,取key 基于新数组长度 计算每个元素新数组下标,元素添加到新数组中去,all元素转移完 新数组赋值给hashMap的table属性
1.8的话
新数组 遍历老数组每个位置上的链表/红黑树
链表,将链表每个元素重新计算下标,添加到新数组中去
红黑树,先遍历红黑树,计算出红黑树中每个元素对应在新数组中下标位置
统计下标位置元素个数,超过6红黑树否链表,转移完 新数组赋值给hashMap的table
copyOnWriteArrayList 底层原理
添加元素时,复制一个新的数组,写操作在新数组上进行,读操作原数组进行
写操作加锁,结束后把原数组指向新数组
ae_readable
spring
容器启动
扫描得到BeanDefinition存到map中,选出非懒加载单例Bean
BeanDefinition创建Bean
合并BeanDefinition 推断构造方法 实例化 属性填充 初始化前 初始化 后
容器启动事件
bean基础
推断构造方法 / 实例化 / 填充属性(依赖注入)
处理aware回调 / postConstruct注解 / 初始化 InitializingBean接口 / aop