美文网首页
ArrayList小抄

ArrayList小抄

作者: 上海马超23 | 来源:发表于2017-07-02 18:21 被阅读0次
public class ArrayList<E> {
  // 数组实现,不需要额外的元信息管理,节约空间
  // 为什么用transient修饰符?
  // 因为大部分情况下数组的容量总是不满的,为了提升序列化性能,只序列化有数据的空间,调用writeObject方法而不是完全拷贝elementData属性
  transient Object[] elementData; 
  
  // 默认数组容量是10
  private static final int DEFAULT_CAPACITY = 10;
  
  // 扩容
  private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        // 超出限制会增加原容量一半的空间(oldCapacity >> 1 即一半)
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        // Arrays.copyOf本质上是调用System.arraycopy()复制到新的数组,对性能有影响
        // 所以最好实例化时能给出预估值。
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    // get访问元素通过下标访问数组,效率高
    E elementData(int index) {
        return (E) elementData[index];
    }
    
    public E set(int index, E element) {
        rangeCheck(index);
        // set也是先通过下标获取原来的值返回,再根据下标修改新值
        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }
    
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        // 默认添加元素到末尾也不会遍历影响性能
        elementData[size++] = e;
        return true;
    }
    
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        // 带有下标参数的add方法,要用System.arraycopy复制部分受影响的元素,性能差
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }
    
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);
        
        // 删除最后一个元素是特例,不会调用arraycopy影响性能
        int numMoved = size - index - 1;
        if (numMoved > 0)
            // remove也调用System.arraycopy,性能差
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            // 通过值remove元素,要从头遍历,性能差
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }
}

相关文章

  • ArrayList小抄

  • 生信学习Day6-小白

    mark下小抄-搜索xx小抄-https://www.rstudio.com/resources/cheatshe...

  • 学习小组Day6笔记——四海

    学习R包 R包都有自己的说明书(cheatsheet),俗称小抄。 获取R包小抄的方法 百度XX小抄 找Rstud...

  • Day6-孟思博

    R包小抄的介绍: R包都有自己的说明书(cheatsheet),俗称小抄。在对包有了一定的了解后,小抄是一个很好的...

  • 小抄

    说到蒋介石就会想起宋美龄,但据说蒋最爱的女人叫陈洁如。蒋初见她则心动不已,对她进行疯狂追求,最后终于赢得美人归。他...

  • 小抄

  • 小抄

    何为孤寂? 清风、艳日、无笑意; 可否具体? 左拥、右抱、无情欲。 可...

  • 小抄

    早知道,这世上,更多的是南辕北辙,而不是殊途同归,以后是平庸还是惊世,是绚丽还是落魄。我都希望,在悲喜交织的岁月,...

  • 小抄

    我心中12岁的你,不是现实的你,你不过是一个假设。一切都是我想象的产物。你仍然保持着你的美丽、健康和聪敏,而且如今...

  • 小抄

    有关你的记忆会留下,你手掌的触感会留下,心灵的剧烈震撼会留下。期盼将你拥入怀中的渴望会留下。纵然我变成了另一个人,...

网友评论

      本文标题:ArrayList小抄

      本文链接:https://www.haomeiwen.com/subject/ouqocxtx.html