容器-數(shù)組-ArrayList

          1. ArrayList概要:
          • 默認(rèn)長度為10
                           public ArrayList() {
                          this(10);
                           }
          • 底層采用數(shù)組存儲(chǔ)private transient Object[] elementData;
                  transient表示數(shù)組elementData不需要通過serialization序列化傳輸
          • 線程不安全,在多線程場景會(huì)出現(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 陳睿 閱讀(1109) 評(píng)論(0)  編輯  收藏 所屬分類: 高級(jí)

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 淮滨县| 翼城县| 孟村| 车险| 辽宁省| 阿拉善左旗| 嘉祥县| 离岛区| 磐石市| 横峰县| 福清市| 青川县| 道孚县| 留坝县| 阳西县| 郸城县| 许昌市| 新化县| 都昌县| 敖汉旗| 邯郸县| 天津市| 九寨沟县| 宾川县| 梅州市| 牙克石市| 白沙| 开封县| 临夏县| 德州市| 平谷区| 灵璧县| 三亚市| 灯塔市| 浏阳市| 马尔康县| 门源| 弥勒县| 韩城市| 玉门市| 达日县|