Arraylist LinkedList 区别 (读 <Java性能优化> 之List接口笔记 )

他们都实现了 List 接口 都不是线程同步的.

ArrayList:无参构造方法

    public ArrayList() {
	this(10); //初始大小为10
    }
   public ArrayList(int initialCapacity) {
	super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
	this.elementData = new Object[initialCapacity];
    }

LinkedList  无参构造方法

    private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;

    /**
     * Constructs an empty list.
     */
    public LinkedList() {
        header.next = header.previous = header;
    }


添加上的区别

  ArrayList.  add方法

 public boolean add(E e) {
	ensureCapacity(size + 1);  // 确保数组有足够的空间
	elementData[size++] = e;   //将对象添加到末尾.
	return true;
    }
在看下 ensureCapacity 方法

 public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length; 
	if (minCapacity > oldCapacity) {   //如果数组容量不够 则进行扩容
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1; //扩容到原来空间的1.5倍
    	    if (newCapacity < minCapacity)             //如果新空间小于最小的空间容量
		newCapacity = minCapacity;             //则使用最小空间容量
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity); //进行扩容的数组复制
	}
    }


LinkedList add方法

 public boolean add(E e) {
	addBefore(e, header);
        return true;
    }

 private Entry<E> addBefore(E e, Entry<E> entry) {
	Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
	newEntry.previous.next = newEntry;
	newEntry.next.previous = newEntry;
	size++;
	modCount++;
	return newEntry;
    }

LinkedList add 将对象添加到herart之前


LinkedList使用了链表结构.因此不需要维护空间的大小. 但是如果频繁的调用会对系统性能上产生一定影响

和ArrayList相比 在add操作的时候 不如add的效率高.


但是在指定插入位置时候 效率LinkedList明显会高于ArrayList

删除任意对象 LinkedList也明显高于ArrayList


在使用 forecah迭代操作时候 两者速度相同

使用传统 for循环 则ArrayList占据优势 


对于数组实现ArrayList来说 随机访问(传统for循环)是很快的. 但是LinkedList是基于链表实现的 使用随机访问效果会很差.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值