容器-數(shù)組-ArrayList

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

          2. ArrayList代碼詳解:

          • 增加元素
            public boolean add(E e) {
              ensureCapacity(size + 1);  // Increments modCount!!
              elementData[size++= e;
              
          return true;
              }
          首先檢查數(shù)組是否已滿,如果滿了就開始擴(kuò)容,擴(kuò)容后的長度為原長度的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表示數(shù)組的操作計數(shù),用于iterator的時候與
          expectedMod
          Count比較,防止迭代操作對add,remove等操作影響迭代操作
            
          int oldCapacity = elementData.length;
              
          if (minCapacity > oldCapacity) {         //新插入元素后的長度大于老的長度,數(shù)組開始擴(kuò)容
                  Object oldData[] 
          = elementData;
                  
          int newCapacity = (oldCapacity * 3)/2 + 1;//新空間為原長度的1.5倍,等于是擴(kuò)容了50%
                      
          if (newCapacity < minCapacity)
                  newCapacity 
          = minCapacity;
                      
          // minCapacity is usually close to size, so this is a win:
                      elementData = Arrays.copyOf(elementData, newCapacity);//把之前的元素拷貝到新的數(shù)組    }
              }

          • 刪除元素:

          /**
               * 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
          ++;        //操作計數(shù)
              E oldValue 
          = (E) elementData[index];

              
          int numMoved = size - index - 1;
              
          if (numMoved > 0)
                  System.arraycopy(elementData, index
          +1, elementData, index,//復(fù)制原數(shù)組制定index+1到length-1的元素到elementData的index的索引位
                           numMoved);
              elementData[
          --size] = null// Let gc do its work//最后一位設(shè)置為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];   //直接獲取數(shù)組的索引位
              }

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

          導(dǎo)航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 揭阳市| 余干县| 旺苍县| 称多县| 松滋市| 东乡族自治县| 夏河县| 大埔县| 周至县| 上栗县| 宝兴县| 东乡族自治县| 盱眙县| 鄂州市| 巴楚县| 都昌县| 郴州市| 兖州市| 宁津县| 洪泽县| 平和县| 涞源县| 怀远县| 论坛| 元氏县| 海晏县| 高安市| 清河县| 金堂县| 东平县| 高雄县| 定边县| 丽水市| 万州区| 天祝| 林西县| 华容县| 墨竹工卡县| 铜鼓县| 德昌县| 广元市|