<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 溫水青蛙 閱讀(2944) 評論(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 都必須遷移該位置之后的所有元素  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 色妞www精品视频免费看| 亚洲日韩av无码中文| 国产成人无码精品久久久免费 | 国产大片免费网站不卡美女| 亚洲国产精品自在在线观看| 性xxxxx大片免费视频| 亚洲AV区无码字幕中文色| 性无码免费一区二区三区在线 | 亚洲aⅴ天堂av天堂无码麻豆| 成年女人免费视频播放77777| 亚洲一卡2卡3卡4卡5卡6卡| 美女被免费视频网站a国产| 亚洲AV无码专区在线厂| 亚洲国产精品尤物yw在线| 成人无码视频97免费| 亚洲精品综合一二三区在线| 97碰公开在线观看免费视频| 亚洲欧洲AV无码专区| 亚洲精品tv久久久久| 久久精品国产影库免费看| 噜噜噜亚洲色成人网站∨| 免费毛片在线看片免费丝瓜视频 | 精品一区二区三区免费视频| 久久亚洲国产欧洲精品一| 久热中文字幕在线精品免费| 亚洲av无码一区二区三区在线播放| 亚洲高清无码专区视频| 日本人成在线视频免费播放| 亚洲最大成人网色香蕉| 国产大片51精品免费观看| 中国videos性高清免费| 亚洲一区二区三区91| 一区国严二区亚洲三区| 少妇人妻偷人精品免费视频| 亚洲AV日韩AV永久无码色欲| 亚洲精品乱码久久久久久按摩| 免费观看的毛片大全| 一二三区免费视频| 亚洲人成电影网站| 亚洲色WWW成人永久网址| 在线天堂免费观看.WWW|