iamhuzl

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            1 隨筆 :: 13 文章 :: 21 評論 :: 0 Trackbacks
             Java面試中關于容器類List,Set是必問題目。但在我的面試經歷中很難遇到滿意的答復。大部分只能了解其大概使用方法,對其內部結構缺乏了解,錯誤的使用方式會導致性能大幅下降。
             首先介紹ArrayList,顧名思義內部數據結構是數組
             private transient Object[] elementData;
             private int size;
             public ArrayList(int initialCapacity){
             }
          

             在增加元素時,若容量不足進行擴充
              public void ensureCapacity(int minCapacity) {
          	modCount++;
          	int oldCapacity = elementData.length;
          	if (minCapacity > oldCapacity) {
          	    Object oldData[] = elementData;
          	    int newCapacity = (oldCapacity * 3)/2 + 1;
              	    if (newCapacity < minCapacity)
          		newCapacity = minCapacity;
                      // minCapacity is usually close to size, so this is a win:
                      elementData = Arrays.copyOf(elementData, newCapacity);
          	}
              }
          

             新數組大小為之前數組大小*1.5+1 ,加上1保證oldCapacity為1的情況也能擴充為2
            (類似分頁時總頁數=(總記錄數+ (每頁記錄數-1))/每頁記錄數算法)

             刪除元素時通過 System.arraycopy把刪除位置后的所有元素前移一個位置實現
          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,
          			     numMoved);
          	elementData[--size] = null; // Let gc do its work
          
          	return oldValue;
              }
          

           
           
            LinkedList大家都知道是通過鏈表實現,內部是一個雙向鏈表
          public class LinkedList<E>
              extends AbstractSequentialList<E>
              implements List<E>, Deque<E>, Cloneable, java.io.Serializable
          {
              private transient Entry<E> header = new Entry<E>(null, null, null);
              private transient int size = 0;
          }
          private static class Entry<E> {
          	E element;
          	Entry<E> next;
          	Entry<E> previous;
          }
          

          插入和刪除都只要改動前后節點的next和previous實現

          總結特點如下:
          類型內部結構順序遍歷速度隨機遍歷速度追加代價插入代價刪除代價占用內存
          ArrayList數組
          LinkedList雙向鏈表

          所以:
          • 一般順序遍歷情況下使用ArrayList,但注意構造函數中設置初始大小
          • 盡量不對ArrayList進行插入或刪除操作(刪除尾部除外),若有多次刪除/插入操作又有隨機遍歷的需求,可以再構建一個ArrayList,把復合條件的對象放入新ArrayList,而不要頻繁操作原ArrayList
          • 經常有刪除/插入操作而順序遍歷列表的情況下最適合使用LinkedList


           

          已有 0 人發表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted on 2012-05-14 15:20 溫水青蛙 閱讀(2945) 評論(2)  編輯  收藏

          評論

          # re: ArrayList,LinkedList使用場景及性能說明 2013-12-24 15:20 ArvinRong
          ?經常有刪除/插入操作而順序遍歷列表的情況下最適合使用LinkedList 更準確的說是不是應該是同時存在大量在頭部和尾部插入數據并順序遍歷的情況下適合使用LinkedList。因為在中部插入數據時在萬級數據單位時LinkedList性能不如ArrayList,而且差距很大,但是在頭部插入時雖然LinkedList性能比較好,但是跟ArrayList差距并沒有特別的大。所以即使是在經常有插入刪除操作時有的時候ArrayList是更好的選擇,另外當數據量不是特別大的時候ArrayList插入性能整體都高于LinkedList。  回復  更多評論
            

          # re: ArrayList,LinkedList使用場景及性能說明 2014-01-23 10:33 溫水青蛙
          【因為在中部插入數據時在萬級數據單位時LinkedList性能不如ArrayList,而且差距很大】
          實測在元素數量為10萬列表中插入1000個元素,LinkedList(369ms)性能是ArrayList(11965ms)的300多倍。
          插入或刪除中間元素時ArrayList 都必須遷移該位置之后的所有元素  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 石阡县| 阳西县| 犍为县| 雷州市| 大冶市| 乌鲁木齐市| 安塞县| 丰原市| 固阳县| 女性| 宁海县| 平原县| 承德县| 新乐市| 澄城县| 麻栗坡县| 濮阳县| 长春市| 景洪市| 穆棱市| 岗巴县| 运城市| 邵阳县| 武清区| 东台市| 榆林市| 洪洞县| 平和县| 会理县| 个旧市| 油尖旺区| 抚顺县| 阿鲁科尔沁旗| 札达县| 景宁| 迁西县| 永靖县| 水城县| 富民县| 团风县| 安徽省|