jdk源码分析
文章平均质量分 54
欢谷悠扬
这世上有一种英雄主义,那就是看清了生活的真相,依然热爱生活
展开
-
ConcurrentModificationException之迭代器并发修改异常原理
1.前言在ArrayList和HashMap等集合中,我们经常可以看到modCount++ ,这个操作是用来记录新增,修改,删除等操作数的。2.并发修改异常出现原因在调用iterator() 后会创建一个迭代器,此时迭代器对象内会维护一个成员变量// 记录当前操作数int expectedModCount = modCount;在迭代器内部的每个操作前都有一个checkForComodification(); 方法,这个就是用来检测是否触发了并发修改异常final void checkFor原创 2021-05-18 17:02:58 · 280 阅读 · 0 评论 -
TreeMap源码浅析
1.源码简述TreeMap的排序可以基于对象自身实现的Comparable接口,也可以基于传入的比较器,两者都没有,那么会报错(cannot be cast to java.lang.Comparable)。modCount 是用于fail fast。主要用于检测并发修改异常问题基于自定义比较器比较,key是否为null,可以自己决定,但是如果使用的是对象实现的Comparable接口,那么key不能为null。删除分为三种情况,当被删除元素有两个子节点时,是通过后继节点进行删除的。(红黑树的红黑原创 2021-05-18 16:19:13 · 154 阅读 · 0 评论 -
LinkedHashMap源码分析
1.简述LinkedHashMap继承自HashMap创建对象与HashMap的基本一致,基本都是调用HashMap的构造方法在newCode方法中完成了按照插入顺序构建链表的过程LinkedHashMap还可以按照访问顺序进行排序,如果想按照访问顺序进行排序,那么首先要将accessOrder设置为true,接着在afterNodeAccess中会对LinkedHashMap进行双向链表调整。2.重要成员变量// 双向链表的头部transient LinkedHashMap.Entry原创 2021-05-14 15:21:59 · 157 阅读 · 0 评论 -
Stack源码浅析
1.结论简述Stack的底层是基于Vector实现的,它继承自Vectorpush操作不是线程安全的,pop,push,peek,search是单操作多线程安全的。复合操作多线程不安全。嗯,这个设计很迷。pop和peek,search之间非线程互斥的,所以peek,search上synchronized的意义是啥?我在pop的同时,能进行peek和search,出现IndexOutOfBoundsException是很容易的。2.入栈 push// push 多线程不安全,无法保证顺序,还容易原创 2021-05-14 11:42:15 · 102 阅读 · 0 评论 -
Stack的底层Vector源码浅析
1.简述Vector可以指定初始容量大小和每次扩容的增量大小,这是ArrayList里面没有的东西public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+原创 2021-05-14 11:20:53 · 97 阅读 · 0 评论 -
HashMap源码分析笔记
前提:以下内容仅为自身理解,请辩证理解。尽信书不如无书~为了方便自己理解,自己加入了一些定义。索引位: hashmap的底层是数组,我称数组的0,1,2,3等的下标所对应的位置为索引位。简述:HashMap底层是一个数组,每个元素通过hash(key) & table.length计算的结果就是这个元素应该落入数组table的哪个索引位。由于会出现hash冲突,也就是多个不同的元素会落入同一个索引位,为了保存这些元素,则会以链表的形式进行存储同一个索引位的元素。在1.8中,当链表达到原创 2021-05-13 19:49:07 · 115 阅读 · 1 评论 -
LinkedList源码简要分析
1.简述LinkedListLinkedList 继承自List和Deque,Deque是双端队列,说明LinkedList可以作为双端队列使用。LikedList底层是一个双向链表transient Node<E> first; 链表头节点transient Node<E> last; 链表尾节点LinkedList根据索引index查询时,会根据索引index是否大于总元素个数的一半来决定是从前往后还是从后往前遍历remove(Object o) 只会移除链原创 2021-05-14 10:47:34 · 357 阅读 · 0 评论 -
ArrayList源码基本分析
1.ArrayList基本分析ArrayList底层机构是数组 transient Object[] elementData;ArrayList底层数组默认大小为10private static final int DEFAULT_CAPACITY = 10;在创建ArrayList对象时,默认是给空数组,如果指定了容量 ,且容量不为0,则会直接申请一个指定容量的数组private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENT原创 2021-05-14 08:01:27 · 68 阅读 · 0 评论