源码
文章平均质量分 66
不想睡觉的橘子君
这个作者很懒,什么都没留下…
展开
-
【多线程】创建线程池有几种方式
经过源码的探究,可以看出,线程池的构造,可以使用newThreadPoolExecutor来直接构造一个自定义的线程池,或者Executors的方法来构造6种不同的线程池。Executors中的6种方法,其中有5种都是调用newThreadPoolExecutor来构造线程池,只有抢占式线程池WorkStealingPool是没有调用newThreadPoolExecutor来实现线程池。[1],面试官线程池有哪几种创建方式,能详细的说下么?httpshttpshttpshttps。......原创 2022-07-20 14:49:53 · 517 阅读 · 0 评论 -
【源码】ArrayList 和 Vector 的区别是什么,及扩容倍数的区别
如文章[1]所说,ArrayList和Vector的区别在于,一,ArrayList线程不安全,Vector线程安全。二,ArrayList扩容是变为原来的1.5倍,而Vector是2倍。本文中要探究的就是扩容倍数这里的源码。ArrayList和Vector,调用add方法时,都会调用一个grow方法,来确保数组的容量够用。两者扩容倍数的不同,仅在于grow方法的实现有所不同。从图中可以看出,Vector扩容的代码为oldCapacity + oldCapacity ,也就是2倍的oldCapaci原创 2022-07-14 15:00:33 · 198 阅读 · 0 评论 -
【源码】HashSet的实现原理
前文已经讲过HashMap的部分实现原理[1],那么HashSet的实现原理是怎样的呢。首先看下HashSet的构造函数。可以清楚的看到HashSet的构造函数其实就是构造了一个HashMap,其初始容量和负载因子都是默认的16和0.75.在add时,方法实现如下:其中PRESENT可以看到,PRESENT是一个new出来的Object对象,它只是起一个辅助作用。其中puVal方法,会返回添加进来的value(PRESENT这个Object对象)或者是Null。而add方法中根据返回的是否是N原创 2022-07-14 10:51:29 · 115 阅读 · 0 评论 -
【源码】HashMap如何读取遇到哈希冲突的key的值
在遇到哈希冲突时,有以下几种方法可以采用:线性探测法(开放地址法)、链式寻址法(链式散列)、再hash、公共区域等方法[1]。在Java中,HashMap采用了链式散列,也就是链式寻址法。通常的说,就是数组+链表。数组的每个元素结构如下:当遇到哈希冲突[2]时,会将节点放在数组这个节点所代表的链表的最后。基本上网上的文章都在说Java的HashMap在遇到哈希冲突时是这么解决的哈希冲突,但是很少有说在get的时候,怎么判断的这个链表里哪个节点是这个key对应的节点。查看了源码以后,发现在get方法是这样原创 2022-07-14 00:00:02 · 1402 阅读 · 0 评论