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

来源:互联网 发布:冈仁波齐神秘事件知乎 编辑:程序博客网 时间:2024/05/22 04:51

他们都实现了 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是基于链表实现的 使用随机访问效果会很差.



原创粉丝点击