1.每日一题
ArrayList和LinkedList区别 ? (网易笔试)
两者性质由底层的实现结构来确定
LinkedList底层实现是双向链表,ArrayList底层是动态数组
- 内存模型不同 ArrayList是数组的连续内存,有大小限制,空间用完需要扩容 ;LinkedList是不连续的内存空间,不需要主动扩容
- 操作方法不同 LinkedList,因为链表的特性,更适合插入和删除。Arraylist因数据特性,更适合查找
- 多线程安全 两者都不是线程安全的
ArrayList怎么实现扩容的呢?
jdk1.7之后,每次扩容为原大小的1.5倍
- 假如默认大小为10,当长度用完,扩容10+10/2=15
int newCapacity = oldCapacity+(oldCapacity>>1);
if(newCapacity-minCapacity<0)
newCapacity=minCapacity;
if(newCapacity-mmaxCapacity>0)
newCapacity=hugeCapacity(minCapacity);
elementData=Arrays.copyOf(elemnetData,newCapacity)
线程不安全?多线程中,如何使用LinkedList容器?
方法1:Cookie使用容易提供的同步方法Collections.synchronizedList(new LinkedList())
每次在写入时,锁住临界区,保证数据一致性
- 比如一个变量初始9,当一个线程正在修改+1操作,另一个线程过来读仍然是9,脏读,数据不一致。线程不安全。
如果变量不是多线程共享的情况,不存在线程不安全。
方法2:换成类似的线程安全的动态数组对象vector