JAVA基础:ArrayList和LinkedList区别

99封情书 提交于 2019-12-26 03:47:23
  • 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
  • 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
  • 3.对于在指定index位置新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 
  • 4.ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。LinkedList线程安全的处理方法

    方法一:List<String> list = Collections.synchronizedList(new LinkedList<String>());
    方法二:将LinkedList全部换成ConcurrentLinkedQueue

  • 为什么在创建ArrayList对象时要初始化默认容量?

   其实就是为了避免扩容,ArrayList扩容方法,这里 ensureCapacityInternal  才是ArrayList内部调用的扩容方法

/** * 公有方法 */public void ensureCapacity(int minCapacity) {    int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)        // any size if not default element table        ? 0        // larger than default for default empty table. It's already        // supposed to be at default size.        : DEFAULT_CAPACITY;    if (minCapacity > minExpand) {        ensureExplicitCapacity(minCapacity);    }}private void ensureCapacityInternal(int minCapacity) {    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);    }    ensureExplicitCapacity(minCapacity);}private void ensureExplicitCapacity(int minCapacity) {    modCount++;    // overflow-conscious code    if (minCapacity - elementData.length > 0)        grow(minCapacity);}


扩容的大小为原容量的1.5倍+1(其实是>>1),该方法下有会改变
modCount的值
modCount变量用于在遍历集合(iterator())时,检测是否发生了add、remove操作。

boolean add(E e) ;//在尾部加入元素void add(int index, E element) ;//在指定位置加入元素

因为调用arraycopy,所以效率低。(但是也没低到哪去 执行100次 每次插入1百万条,查了0.016s)

System.arraycopy(elementData, index, elementData, index + 1,size - index);

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!