Java ArrayList特點和底層實現

Java ArrayList特點:

ArrayList底層是用數組實現的存儲。 特點:查詢效率高,增刪效率低,線程不安全。

查看ArrayList源碼:
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
   
    transient Object[] elementData; // non-private to simplify nested class access

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;
    
....

分析:可以看出ArrayList底層使用Object數組來存儲元素數據,ArrayList是可以存放任意數量的對象,長度不受限制,如何實現?我們來實現一下。

Step1:構造主框架
package com.ysl.mycollection;

public class SxtArrayList<E> {
    private Object[] elementData;
    private int size;

    private static final int DEFALT_CAPACITY = 10;

    public SxtArrayList(){
        elementData = new Object[DEFALT_CAPACITY];
    }

    public SxtArrayList(int capacity){
      

    public void add(E element){

    }

    public void remove(E element){

    }

    public void remove(int index){

    }

    public E get(int index){

    }

    public void set(E element, int index){

    }

    public boolean isEmpty(){

    }

    //索引合法判斷
    public void checkRange(int index){
       
    }

    @Override
    public String toString() {
     
    }

    public static void main(String[] args) {
        SxtArrayList s1= new SxtArrayList<>();

    }
}

Step2:class SxtArrayList<E>下定義部分方法
	public void add(E element){

        if(size == elementData.length){
            Object[] newArray = new Object[elementData.length+(elementData.length>>1)];
            System.arraycopy(elementData,0,newArray,0,elementData.length);
            elementData = newArray;
        }
        elementData[size++] = element;
    }

    public void remove(E element){
        for(int i=0;i<size;i++){
            if(element.equals(get(i))){
                remove(i);
            }
        }
    }

    public void remove(int index){
        int num = elementData.length-index-1;
        if (num > 0) {
            System.arraycopy(elementData,index+1,elementData,index,num);
        }
        elementData[size-1]=null;
        size--;

    }

    public E get(int index){
        checkRange(index);
        return (E)elementData[index];
    }

    public void set(E element, int index){

        checkRange(index);
        elementData[index] = element;

    }

    public boolean isEmpty(){
        return size==0?true:false;
    }

    //索引合法判斷
    public void checkRange(int index){
        if(index<0||index>size-1){
            throw new RuntimeException("索引不合法:"+index);
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        //控制輸出格式爲[a,b,c]
        sb.append("[");
        for(int i=0;i<size;i++){
            sb.append(elementData[i]+",");
        }
        sb.setCharAt(sb.length()-1,']');

        return sb.toString();
    }
Step3:main方法中實現方法
		for(int i=0;i<40;i++){
            s1.add("Ysl"+i);
        }
        s1.set("tyy",39);
        s1.remove("Ysl1");
        System.out.println(s1.isEmpty());
        System.out.println(s1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章