HashMap全解有了,Redis全解有了,今天来个简单的ArrayList全解!废话不多说,开问!
ArrayList底层是什么?
ArrayList底层就是一个Object类型的数组。
ArrayList初始容量?
ArrayList 初始容量为0,第一次add之后扩容为10,类似懒加载。
ArrayList扩容机制,每次扩容多少?
每次扩容为当前容量的1.5倍。
扩容拷贝使用方法?
使用的是Arrays.copyOf()。
默认容量为10,第一次扩容后为15,那第二次扩容后数组长度?
22=15+7
ArrayList线程安全吗?
不安全
你说ArrayList线程不安全,请举个例子说明?
为什么会导致这个问题?
多个线程并发争抢资源类,且资源类没加锁!
那如何解决上面的情况?
使用Vector来代替List:
我们都知道Vector性能较低,有没有其他方式实现线程安全?
使用juc中的Collections.synchronizedList()
提醒你一下:知不知道什么叫写时复制?
这是使用JUC解决list多线程不安全的高级技术!CopyOnWriteArrayList
CopyOnWriteArrayList 是如何实现线程安全的?
CopOnWrite容器即写时复制容器。在往一个容器添加元素时,不直接往当前容器Object[]添加元素,而是先将当前容器Object[]进行Copy,复制出一个新的容器Object[] newElements,然后往新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器setArray(newElements),这样做的好处时可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素,所以CopyOnWrite容器也是一种读写分离的思想,读和写的容器不同。