源码日记——ArrayList

来源:互联网 发布:淘宝机票平台出租 编辑:程序博客网 时间:2024/06/03 09:50

extends AbstractList<E>

implements List<E>, RandomAccess, Cloneable, java.io.Serializable

---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

方法追踪:public boolean contains(Object o) { return indexOf(o) >= 0;}

        ——>>public int indexOf(Object o) {  if (o == null) {  for (int i = 0; i < size; i++) if (elementData[i]==null)  return i; } else { for (int i = 0; i < size; i++)
                    if (o.equals(elementData[i])) return i; }  return -1; }

         分析:屏蔽参数为null,则核心o.equals(elementData[i])和i<size;从这两点可以猜测核心是素组组成elementData[i],并且素组大小为类变量size。

         总结:contains方法根据参数,用参数跟数组中的内容进行对比,如果相同(意味数组中包含元素与参数相同)就返回true,否则返回false。

   public Object[] toArray() {  return Arrays.copyOf(elementData, size); }//将数组内容复制一份作为返回值返回。大哭大哭


======================================================

get方法对比step1:与LinkedList的get方法对比

ArrayList实现方法:

public E get(int index) {

rangeCheck(index);

        return elementData(index);
    }//这里忽略rangeCheck(index);——>>

E elementData(int index) {
        return (E) elementData[index];
    }

LinkedList实现方法:

public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }//这里忽略checkElementIndex(index);——>>

Node<E> node(int index) {
        // assert isElementIndex(index);


        if (index < (size >> 1)) {
          Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
                return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

比较结果:ArrayList实现get方法是通过数组下标直接找到对应元素,而LinkedList则是从元素列表头部开始遍历寻找,结果不言而喻了大笑大笑


set方法:public E set(int index, E element) { rangeCheck(index);  E oldValue = elementData(index);  elementData[index] = element;   return oldValue;   }

将元素element,放入到下标为index的数组位置上,替换掉原来的元素,并把原先的元素作为返回值返回。

与LinkedList实现不同之处与get方法大同小异。


add方法:①public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

比LinkedList麻烦多,LinkedList中只需要修改最后元素并把参数作为最后元素就OK,而ArrayList要复杂的多,主要体现在容量扩张上 ensureCapacityInternal(size + 1),顾名思义 确保 容量够用。效果明显不如Linkedlist。大笑大笑


②public void add(int index, E element) {
        rangeCheckForAdd(index);


        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

目的是在数组的某位置上index插入一个元素element,与Linkedlist对比的话,分两部分,第一步先找到第index个元素,ArrayList要优于LinkedList,而将element插入内容中LinkedList就比较有优势。。如果元素个数多,查找过程LinkedList吃亏,但是在插入过程ArrayList就不如LinkedList了,对于这个方法应该不能从元素个数判别使用哪个更好。


LinkedList和ArrayList方法中都存在remove(int index);和remove(Object o);两种方法,都是移除元素,前者按照元素排序号删除,后者则是指定固定元素删除。

原创粉丝点击