容器-數組-ArrayList

          1. ArrayList概要:
          • 默認長度為10
                           public ArrayList() {
                          this(10);
                           }
          • 底層采用數組存儲private transient Object[] elementData;
                  transient表示數組elementData不需要通過serialization序列化傳輸
          • 線程不安全,在多線程場景會出現問題,可以考慮使用Vector或者Collections.synchronizedList同步該容器
          • 查詢效率比較高,比較適用于查詢
          • 擴容的長度為初始長度的一半,建議初始化的時候設置已知的長度,免得容器自己去擴容,浪費空間以及效率

          2. ArrayList代碼詳解:

          • 增加元素
            public boolean add(E e) {
              ensureCapacity(size + 1);  // Increments modCount!!
              elementData[size++= e;
              
          return true;
              }
          首先檢查數組是否已滿,如果滿了就開始擴容,擴容后的長度為原長度的1.5倍。
          /**
               * Increases the capacity of this <tt>ArrayList</tt> instance, if
               * necessary, to ensure that it can hold at least the number of elements
               * specified by the minimum capacity argument.
               *
               * 
          @param   minCapacity   the desired minimum capacity
               
          */
              
          public void ensureCapacity(int minCapacity) {
              modCount
          ++;//modCount表示數組的操作計數,用于iterator的時候與
          expectedMod
          Count比較,防止迭代操作對add,remove等操作影響迭代操作
            
          int oldCapacity = elementData.length;
              
          if (minCapacity > oldCapacity) {         //新插入元素后的長度大于老的長度,數組開始擴容
                  Object oldData[] 
          = elementData;
                  
          int newCapacity = (oldCapacity * 3)/2 + 1;//新空間為原長度的1.5倍,等于是擴容了50%
                      
          if (newCapacity < minCapacity)
                  newCapacity 
          = minCapacity;
                      
          // minCapacity is usually close to size, so this is a win:
                      elementData = Arrays.copyOf(elementData, newCapacity);//把之前的元素拷貝到新的數組    }
              }

          • 刪除元素:

          /**
               * Removes the element at the specified position in this list.
               * Shifts any subsequent elements to the left (subtracts one from their
               * indices).
               *
               * 
          @param index the index of the element to be removed
               * 
          @return the element that was removed from the list
               * 
          @throws IndexOutOfBoundsException {@inheritDoc}
               
          */
              
          public E remove(int index) {
              RangeCheck(index); //檢查索引是否溢出

              modCount
          ++;        //操作計數
              E oldValue 
          = (E) elementData[index];

              
          int numMoved = size - index - 1;
              
          if (numMoved > 0)
                  System.arraycopy(elementData, index
          +1, elementData, index,//復制原數組制定index+1到length-1的元素到elementData的index的索引位
                           numMoved);
              elementData[
          --size] = null// Let gc do its work//最后一位設置為null

              
          return oldValue;
              }

           /**
               * Checks if the given index is in range.  If not, throws an appropriate
               * runtime exception.  This method does *not* check if the index is
               * negative: It is always used immediately prior to an array access,
               * which throws an ArrayIndexOutOfBoundsException if index is negative.
               
          */
              
          private void RangeCheck(int index) {
              
          if (index >= size)
                  
          throw new IndexOutOfBoundsException(
                  
          "Index: "+index+", Size: "+size);
              }

          • 獲取元素:
           /**
               * Returns the element at the specified position in this list.
               *
               * 
          @param  index index of the element to return
               * 
          @return the element at the specified position in this list
               * 
          @throws IndexOutOfBoundsException {@inheritDoc}
               
          */
              
          public E get(int index) {
              RangeCheck(index);

              
          return (E) elementData[index];   //直接獲取數組的索引位
              }

          posted on 2012-02-20 14:28 陳睿 閱讀(1108) 評論(0)  編輯  收藏 所屬分類: 高級

          導航

          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 扎鲁特旗| 惠水县| 叙永县| 九龙县| 晋城| 广南县| 汝南县| 乌鲁木齐县| 历史| 大庆市| 长治市| 黔江区| 蒲城县| 新竹县| 河西区| 凌源市| 庆安县| 扬州市| 资源县| 八宿县| 曲水县| 梁平县| 西峡县| 潜山县| 定远县| 平泉县| 开平市| 光山县| 盐池县| 芦山县| 江山市| 滦平县| 新宁县| 滁州市| 玉溪市| 界首市| 咸宁市| 沧州市| 盘山县| 连江县| 远安县|