List

介绍

1、元素有序(添加与取出顺序一致)、且可以重复
2、支持索引

ArrayList

介绍

1、可以加入一个或多个null
2、由数据实现数据存储
3、基本等同于Vector,但是ArrayList是县城不安全的(执行效率高),在多线程情况下,不建议使用ArrayList

add()方法源码

public boolean add(E e){
ensureCapacityInternal(size+1);
elementData[size++]=e;
return true;
}

ArrayList底层

1、ArrayList中维护了一个Object类型的数组elementData。

transient Object[] elementData;//transient 瞬间、短暂的。不会被序列化

2、创建AarrayList对象时,如果使用的是无参构造器,则初始elementData容量为0。第一次添加时扩容elementData为10。如需要则再次扩容,扩容大小为之前的1.5倍(本身+本身右移一位,即1+0.5=1.5倍)
3、如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如需扩容,则扩容至1.5倍。

List.add
1确定是否要扩容
2赋值
ensureCapacityInternal
确定minCapacity 即需要空间大小
ensureExplicitCapacity
1modCount++ 记录集合被修改的次数
2如果minCapacity-集合长度>0
则调用grow扩容
grow
1第一次扩容为10
2第二次及以后为1.5倍
使用Arrays.copyOf扩容
保留原有数据扩大空间

Vector

介绍

1、底层也是数组

protected Object[] elementData

2、线程同步,即线程安全,类操作方法带有synchronized
3、考虑线程安全时,优先使用Vector

扩容算法

newCapacity=old Capacity+((capacityIncrement>0)?capacityIncrement:oldCapacity);

capacityIncrement默认为10,即默认大小为10,2倍扩容。

LinkedList

介绍

1、底层为双向链表和双端队列
2、元素可重复,允许null值
3、线程不安全

底层

1、first和last,指向首节点和尾节点
2、每个节点(Node对象)中有prev、next、item三个属性,prev指向前一个,next指向后一个。

add()源码

void LinkLast(E e){
	final Node<E> l=last;
	final Node<E> newNode=new Node(l,e,null);
	last=newNode;
	if(l=null)
		first=newNode;
	else
		l.next=newNode;
	size++;
	modCount++;
 }

remove()源码

private E unlinkFirst (Node <E> f){
	//assert f==first && f!=null;
	final E element=f.item;
	final Node<E> next=f.next;
	f.item=null;
	f.next=null;//help GC  垃圾回收
	first=next;
	if(next=null)
		last=null;
	else
		next.prev=null;
	size--;
	modcount++;
	return delement;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值