回覆列表
  • 1 # 此生唯一

    ArrayList相關的知識點也是java面試中最頻繁出現的點,下面從原始碼的角度來分析下Arraylist!

    1,ArrayList中的屬性:ArrayList中的屬性主要定義了一個物件陣列(Object[]),大小(size),初始容量(DEFAULT_CAPACITY=10)等等,從屬性中就可以知道ArrayList的底層就是一個數組,使用泛型E來存放構造器中傳入的物件型別,當然ArrayList存放的並不是物件本身,而是物件的引用,所以ArrayList不能存放八個基本型別的資料;

    2,ArrayList的主要方法:從下面截圖可以看出,ArrayList中的主要方法就是元素的add(增),remove(刪),set(改),get(查),而由這四大類方法自然衍生了獲取大小,擴容,清空,包含等方法!

    下面就主要方法進行分析:

    1,add方法(add(i),addAll()等類似):

    ①,先判斷加入元素後的陣列大小,如果是小於初始容量則返回初始容量,否則返回+1後的容量值; ②,容量加1,同時跟未加入元素時的陣列length比較,如果大於length,則使用grow方法進行擴容;

    ③, int newCapacity = oldCapacity + (oldCapacity >> 1); >>右移符號,相當於除二,即新容量為老容量的(1+0.5=1.5)倍,再進行判斷是否新容量已經超限(Integer.MAX_VALUE - 8),如果超限,則置為最大容量,否則使用Arrays.copyOf複製得到新陣列;

    2,remove方法(remove其他方法類似):

    ①,先判斷是否下標越界,越界丟擲異常,否則繼續

    ②,獲取到相應下標的元素;

    3,get,set方法:比較簡單,就是使用指定下標進行資料替換或者獲取;

    記錄幾個ArrayList中碰到的坑 :

    1,執行緒不安全:所有的資料存取都是執行緒不安全的,所以多執行緒環境要麼使用Vector,要麼使用CopyOnWriteArrayList;

    2,Arraylist是實現了序列化介面的,但使用subList方法返回的是SubList物件,這個物件並沒有序列化,在網路傳輸中會報錯的;

  • 中秋節和大豐收的關聯?
  • 什麼顏色的狗狗更容易生病?