java集合
weixin_44029692
这个作者很懒,什么都没留下…
展开
-
CopyOnWriteArrayList源码
一、简介之前我们分析了ArrayList的源码,但它不是线程安全的,多线程环境下一些问题,比如并发导致数据丢失,并发导致插入null,并发导致数组越界等。所以今天我们来分析线程安全的CopyOnWriteArrayList,CopyOnWrite也就是写时复制。写时复制的思想是当我们往一个容器添加或者删除元素的时候,不直接往当前容器添加,而是将当前容器复制出一个新的容器,然后在新的容器里进行操作,操作完成之后,再将原来容器的引用指向新的容器。这样做的好处就是读写分离,读不加锁,写加锁,读写不冲突,提高并发原创 2020-05-28 10:33:55 · 279 阅读 · 0 评论 -
【Java集合源码解析】ArrayList源码分析
一、简介ArrayList的底层实现原理是动态数组,所以它需要占据了一块连续的内存空间,其长度就是数组的大小,因为底层是数组,所以ArrayList可以以O(1)的时间复杂度去根据下标访问元素。在每次添加新的元素时,ArrayList都会检查是否需要进行扩容操作,扩容是十分消耗性能的操作,所以知道集合组要多大的容量,再初始化的时候就进行赋值。二、源码阅读先来看看继承关系ArrayList实现了List,提供了基础的添加、删除、遍历等操作。ArrayList实现了RandomAccess,提供了随原创 2020-05-27 10:27:48 · 136 阅读 · 0 评论 -
【Java集合源码解析】LinkedList源码分析
LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现。基于链表实现的方式使得 LinkedList 在随机插入和删除时更优于 ArrayList,而随机访问则比 ArrayList 逊色些。本文主要通过源码分析 LinkedList。LinkedList 的类结构public class LinkedList<E> extends AbstractSequ原创 2020-05-22 20:10:04 · 153 阅读 · 0 评论 -
JDK1.7的HashMap链表死循环分析
在JDK1.7及以前的版本,如果在并发环境中使用HashMap保存数据,有可能会产生死循环的问题,造成cpu的使用率飙升。产生这个问题是因为JDK1.7及以前的版本中,HashMap扩容采用的是头插入,1.8做的改进是采用尾插法,所以不会造成死循环的问题。 首先,来看1.7扩容的代码: //进行扩容时方法 void resize(int newCapacity) { ...原创 2019-04-10 22:37:05 · 2445 阅读 · 0 评论 -
为什么java不要在foreach循环里进行元素的remove/add操作
为什么java不要在foreach循环里进行元素的remove/add操作首先结论是“1”不会报错,但是“2“会出现ConcurrentModificationException(当方法检测到对象的并发修改,但不允许这种修改时就抛出该异常)。从上面我们可以知道是checkForComodification出现的异常,看一下源码final void checkForComodificatio...原创 2019-08-16 16:57:40 · 439 阅读 · 0 评论