jdk源码阅读
文章平均质量分 88
リュウセイリョウ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JDK源码阅读(十四) : 优先级队列——PriorityQueue
1. 优先级队列PriorityQueue是一种基于堆的无界优先级队列。内部使用Object数组存储数据,在容量不足时会进行扩容操作。内部元素的排序规则,按照构造实例时传入的Comparator或者元素自身的排序规则(所属类实现Comparable接口)。2. Fields默认的数组长度为11。private static final int DEFAULT_INITIAL_CAPACITY = 11;用于存储数据的Object数组。transient Object[] queue;元素数原创 2021-01-09 16:21:20 · 272 阅读 · 0 评论 -
JDK源码阅读(十三) : 单端阻塞队列——ArrayBlockingQueue
1. 队列队列是一种先进先出(First In First Out)的数据结构。可以分成阻塞和非阻塞两类:阻塞队列,即如果队列已满,入队操作会阻塞;如果队列为空,出队操作也会阻塞。(Blocking标识)非阻塞队列,即如果队列已满,执行入队操作会直接返回;如果队列为空,执行出队操作也是直接返回。也可以分成单端和双端两类:单端队列,即只能在队尾入队,队首出队;(Queue标识)双端队列,队首队尾都可以出队。(Deque标识)单端阻塞队列:主要有ArrayBlockingQueue(内原创 2020-12-29 21:28:19 · 281 阅读 · 0 评论 -
JDK源码阅读(十二) : 基于跳表的并发容器——ConcurrentSkipListMap
1. 简介ConcurrentSkipListMap是有序的hash表,是线程安全的。与之对比的另外两种hash容器,ConcurrentHashMap虽然是线程安全的,但是key并不是有序的;而TreeMap虽然key是有序的,但是不是线程安全的。ConcurrentSkipListMap采用无锁方案,支持更高的并发,存取时间是O(logN),与线程数无关。也就是说,当数据量一定的情况下,并发线程数越多,ConcurrentSkipListMap优势越大。2. 数据结构ConcurrentSki原创 2020-12-29 16:38:25 · 486 阅读 · 1 评论 -
JDK源码阅读(十一) : 并发容器——ConcurrentHashMap
1. Why ConcurrentHashMap?在java1.7版本,数组中发生冲突的节点以链表形式相连,在进行HashMap在执行put方法时,通过头插法插入到单链表中。然而put过程中可能会触发扩容操作,此时会将原数组的内容重新散列(rehash)到新的数组中。在多线程环境下,如果多个线程同时执行put方法,可能会使数组某一位置上的链表形成闭环,继而出现死循环,cpu飙升到100%。所以java1.7中的hashmap不是线程安全的。而同步容器HashTable虽然是线程安全的,但是锁的粒度太大,原创 2020-12-28 17:02:46 · 255 阅读 · 0 评论 -
JDK源码阅读(十) : 并发容器——CopyOnWriteArrayList
1. 同步容器和并发容器Java1.5以前,提供线程安全的容器是同步容器,比如Vector、Stack 和 Hashtable,这些容器使用synchronized关键字修饰方法,以保证互斥。这种方式的串行度太高,所以效率很低。Java1.5开始,提供了性能更好的并发容器。并发容器也可分成四大类:List、Map、Set和Queue。2. CopyOnWriteArrayListCopyOnWriteArrayList是ArrayList的线程安全版本,从名称上来看,它是写时复制的ArrayList原创 2020-12-23 17:21:33 · 251 阅读 · 0 评论 -
JDK源码阅读(九) : 不重复的集合——HashSet
1. SetSet一种存储不重复元素的容器。也就是说,Set容器中的元素,不可以出现一个元素equals另一个元素,并且最多也只能有一个元素为null。Set家族较为常见的实现类是HashSet和LinkedHashSet。本文将介绍这两个类的源码实现( JDK8)。2. HashSetHashSet无法保证集合的迭代顺序,并且也无法保证集合中元素的排列顺序随着时间的推移保持不变。HashSet的实现方式并非线程安全的,在多线程环境下,我们需要在外部进行同步操作。2.1 继承关系和成员属性Ha原创 2020-12-22 17:06:41 · 267 阅读 · 0 评论 -
JDK源码阅读(八) : 增强的HashMap——LinkedHashMap
1. 继承关系LinkedHashMap继承了HashMap类和Map接口。与HashMap的不同之处在于,LinkedHashMap内部保存了一个双链表,这个双链表将所有的key-value对按照加入顺序或者访问顺序连接起来。并且,这个双链表的顺序,也决定了对该LinkedHashMap的迭代顺序。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>Lin原创 2020-12-21 21:57:21 · 235 阅读 · 0 评论 -
JDK源码阅读(七) : 容器——解锁HashMap
1. MapMap是一种存储键值对(key-value)的容器,容器中一个key映射到一个唯一的value,所有的key不可以重复。Map提供了三种集合视图,分别是key的集合(不重复)、value的集合(可重复)和key-value对的集合(entry,不重复)。一个Map实例自身不可以作为自己的key,但是可以作为自己的value。Map家族使用较多的实现类是HashMap、LinkedHashMap。本文将主要介绍这两个类的实现方式 (jdk11版本)。2. HashMapHashMap是原创 2020-12-20 15:37:26 · 388 阅读 · 3 评论 -
JDK源码阅读(六) : 容器——ArrayList
1. List家族List是集合类容器的上层接口,List家族有很多我们常用的容器,这些容器都实现了List接口,使用最频繁的是ArrayList和LinkedList,本文主要讨论这两种容器。2. ArrayListArrayList不是多线程版本的容器,因此不需要做同步操作synchronized,保证了操作的效率,如果我们需要对单个ArrayList容器做多线程操作,可以在外部进行同步控制。而List家族另一个古老的容器类Vector则是多线程版本的,现在使用不多。2.1 继承关系和成员属性原创 2020-12-13 21:39:03 · 251 阅读 · 0 评论 -
JVM源码阅读(五) : 反射——Field、Constructor和Method
一、Field类Field类提供了某个类或接口中的属性信息,既可以是类属性,也可以是实例属性。1. 字段介绍//这个属性是属于哪个类,通过调用getDeclaringClass方法可以获取到声明这个属性的类private Class<?> clazz;private int slot;//主要用于虚拟机实施反射private String name;//该属性是什么类型的private Class&原创 2020-12-03 16:07:00 · 241 阅读 · 0 评论 -
JDK源码阅读(四) : 反射——Class
1. 什么是Classjava中一切皆对象。java中所有的类或接口(enum或annotation也是一种接口)其实都是对象,它们都是Class类的实例。数组类型也是一种Class对象,它抽象了所有元素类型相同且维度相同的数组。基础数据类型(比如int、byte)也可以作为Class类的对象。2. 获取Class对象Class对象是在类加载时由java虚拟机自动创建的。/* * 构造器为private,只有JVM才能创建Class对象 */private Class(ClassLoader原创 2020-11-30 20:38:11 · 312 阅读 · 0 评论 -
JDK源码阅读 (三) : StringBuffer、StringBuilder
2. StringBufferStringBuffer与String类似,不同之处在于,StringBuffer不具有不可变性,它所持有的字符序列可以被修改。也就是说,当我们对本对象调用拼接或剪裁等操作时,最后返回的是这个对象自身。此外,StringBuffer还是线程安全的。类中提供的方法都以Synchronized修饰,表明多线程操作时受到同步机制的限制。虽然保证了线程安全,但是也带来了额外的性能开销。因此,在没有线程安全需求的情况下,推荐使用后文介绍的StringBuilder,它是StringB原创 2020-11-23 16:04:51 · 260 阅读 · 0 评论 -
JDK源码阅读 (二) : String
1. String1.1 构造String对象有两种方式可以构造一个String对象:String s1 = "dog";String s2 = new String("dog");①第一种构造方式是直接从字符串常量池中取得一个字符串对象"dog",然后s1指向常量池中对应的位置。需要注意的是,当试图从字符串常量池中取得"dog"对象时,发现没有,则会在池中创建该对象。当下一次又要从池中获取"dog"对象时,可以直接取得。这是一种缓存思想。②第二种构造方式是在堆中申请一块区域,使用构造器创建原创 2020-11-18 11:06:12 · 3559 阅读 · 0 评论 -
JDK源码阅读 (一) : 包装类 Integer
1. Integer1.1 自动装箱和自动拆箱示例代码 ( jdk 8.0 )://通过构造器创建一个Integer对象Integer value1 = new Integer(3);//通过自动装箱获取一个Integer对象Integer value2 = 3;①使用构造器创建Integer对象//调用Integer类的构造方法时,首先依次调用父类的构造方法//然后调用本类的构造方法,给成员value赋值public Integer(int value) { this.val原创 2020-11-14 18:24:23 · 197 阅读 · 0 评论
分享