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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章