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


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲av纯肉无码精品动漫| 亚洲人成黄网在线观看| 免费人成网上在线观看| 国产99视频免费精品是看6| 亚洲av无码一区二区三区四区| 久久综合AV免费观看| 亚洲av无码专区国产不乱码| 国产精品成人免费一区二区| 亚洲一区二区三区丝袜| 国产成人免费高清在线观看| 黄色网址在线免费观看| 亚洲日韩av无码| 久久伊人免费视频| 亚洲欧洲日产国产最新| 免费看的成人yellow视频| 日韩免费在线中文字幕| 日韩亚洲变态另类中文| 久久精品无码专区免费东京热| 亚洲精品亚洲人成在线观看麻豆| 2021在线观看视频精品免费| 亚洲人成色4444在线观看| 一区国严二区亚洲三区| 国产精品免费大片| 亚洲日本一线产区和二线 | 在线精品免费视频| 国产精品亚洲а∨天堂2021 | 久久笫一福利免费导航| 国产尤物在线视精品在亚洲| 中文字幕精品亚洲无线码二区| 蜜桃成人无码区免费视频网站 | 亚洲久悠悠色悠在线播放| 国产婷婷高清在线观看免费 | 91网站免费观看| 日本精品久久久久久久久免费| 亚洲国产精品一区第二页| 亚洲高清免费在线观看| 老湿机一区午夜精品免费福利| 久久亚洲中文字幕精品有坂深雪| 日韩精品视频免费网址| 免费视频精品一区二区三区 | 亚洲视频小说图片|