Ytl's Java Blog

厚积而薄发---每一天都是一个全新的开始
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java 原码代码学习

Posted on 2011-09-24 15:30 ytl 阅读(282) 评论(0)  编辑  收藏 所属分类: 学习总结
ArrayList
       关于Java中的transient,volatile和strictfp关键字 http://www.iteye.com/topic/52957
       (1), ArrayList底层使用Object数据实现, private transient Object[] elementData;且在使用不带参数的方式实例化时,生成数组默认的长度是10。
      (2),  add方法实现
      public boolean add(E e) {
           //ensureCapacityInternal判断添加新元素是否需要重新扩大数组的长度,需要则扩否则不
          ensureCapacityInternal(size + 1);  // 此为JDK7调用的方法 JDK5里面使用的ensureCapacity方法
          elementData[size++] = e; //把对象插入数组,同时把数组存储的数据长度size加1
          return true;
      }
     JDK 7中 ensureCapacityInternal实现
   private void ensureCapacityInternal(int minCapacity) {
        modCount++;修改次数
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);//如果需要扩大数组长度
    }
/**
     * The maximum size of array to allocate. --申请新数组最大长度
     * Some VMs reserve some header words in an array.
     * Attempts to allocate larger arrays may result in
     * OutOfMemoryError: Requested array size exceeds VM limit  --如果申请的数组占用的内心大于JVM的限制抛出异常
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//为什么减去8看注释第2行
    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); //新申请的长度为old的3/2倍同时使用位移运算更高效,JDK5中: (oldCapacity *3)/2+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:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
 //可以申请的最大长度
    private static int hugeCapacity(int minCapacity) { 
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }