容器-數(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í)候設(shè)置已知的長度,免得容器自己去擴(kuò)容,浪費(fèi)空間以及效率

          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ù)組的操作計(jì)數(shù),用于iterator的時(shí)候與
          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
          ++;        //操作計(jì)數(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)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 东方市| 弥勒县| 武义县| 琼结县| 集安市| 曲阳县| 辽源市| 扬中市| 神木县| 天津市| 禹城市| 化德县| 乌什县| 开平市| 彰化县| 安义县| 额尔古纳市| 青河县| 永定县| 府谷县| 昌都县| 山阳县| 康定县| 岫岩| 平凉市| 古蔺县| 泸定县| 巴东县| 舒兰市| 延庆县| 贵德县| 醴陵市| 凤城市| 华容县| 齐齐哈尔市| 阜阳市| 德昌县| 东城区| 兰考县| 突泉县| 兰溪市|