arraylist add(int index) 方法時 index是處於前半部分還是後半部分效率高


  1. public void add(int index, E element) {  
  2.      if (index > size || index < 0)  
  3.          throw new IndexOutOfBoundsException(  
  4.          "Index: "+index+", Size: "+size);  
  5.    
  6.      ensureCapacity(size+1);  // Increments modCount!!  
  7.      System.arraycopy(elementData, index, elementData, index + 1,  
  8.               size - index);  
  9.      elementData[index] = element;  
  10.      size++;  
  11.      }  
  12. 看源碼就知道了,無論傳入的是哪個index,都要進過if判斷,
  13. 假如不超過容量,看這個System.arraycopy,這其實是個native方法,方法我們發現實現的是自我複製,首先用臨時數組把index後的數據取走然後再拷回到index+1ao後面,此時我們分析下,如果加在最前,那所有數據都需要用中間臨時數組拷貝走,再拷貝回來,如果加在最後,length=0,就不需要用到臨時數組了,直接加進來即可繼續看System.arraycopy源碼,這是一個本地方法,代碼見http://www.360doc.com/content/14/0713/19/1073512_394157835.shtml,

  14. 可以看到length=0時,直接返回,
  15. 當大於0時最後用到了c語言的void *memmove(void *dst, const void *src, size_t count)函數。
  16. 所以說加到後半部分是優於加到前半部分的。

  17. 同時這也說明了arraylist的add()無index方法加到最後的原因,此時無需中間數組,也少了一次本地方法調用。
  18. 這是add()無index參數的源碼
  19. public boolean add(E e) {  
        ensureCapacityInternal(size + 1);   
        elementData[size++] = e;  
        return true;  
    }   


  1. remove也是這樣,後半部分比前半部分效率高


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章