ArrayList的简单实现(手写)

对着源码改的,还有一些方法没有添加,后续有时间再实现

直接上代码:

/**
 * 1.ArrayList的简单实现(手写)
 * 2.包括以下方法:
 *              int size();
 *              MyArrayList();
 *              MyArrayList(int initialCapacity);
 *              boolean isEmpty(); 
 *              Object get(int index);
 *              boolean add(Object obj);
 *              void add(int index,Object obj)
 *              Object remove(int index)
 *              boolean remove(Object obj)
 *              Object set(int index,Object obj)
 *              void rangeCheck(int index)
 *              void ensureCapacity()
 */
package com.lfj.MyList;

import javax.swing.plaf.synth.SynthSpinnerUI;

public class MyArrayList {

    private Object[] elementData;       //底层数组
    private int size;                   //数组大小

    public int size(){
        /*
         * 返回数组大小
         */
        return size;
    }

    public MyArrayList(){
        /*
         * 无参构造器,通过显式调用含参构造器
         */
        this(10);
    }

    public MyArrayList(int initialCapacity){
        /*
         * 1.含参构造器
         * 2.要对传入的初始量的合法性进行检测
         * 3.通过新建数组实现
         */
        if(initialCapacity<0){
            try {
                throw new Exception();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        elementData=new Object[initialCapacity];
    }

    public boolean isEmpty(){
        /*
         * 判断是否为空
         */
        return size==0;
    }

    public Object get(int index){
        /*
         * 1.获取指定下标的对象
         * 2.下标合法性检测
         */
        rangeCheck(index);
        return elementData[index];
    }

    public boolean add(Object obj){
        /*
         * 添加对象(不指定位置)
         * 注意数组扩容
         */
        ensureCapacity();
        elementData[size]=obj;
        size++;
        return true;
    }   

    public void add(int index,Object obj){
        /*
         * 插入操作(指定位置)
         * 1.下标合法性检查
         * 2.数组容量检查、扩容
         * 3.数组复制(原数组,开始下标,目的数组,开始下标,长度)
         */
        rangeCheck(index);
        ensureCapacity();
        System.arraycopy(elementData, index, elementData, index+1,size-index);
        elementData[index]=obj;
        size++;
    }
    public Object remove(int index){
        /*
         * 1.删除指定下标对象,并返回其值
         * 2.下标合法性检测
         * 3.通过数组复制实现
         * 4.因为前移,数组最后一位要置为空
         */
            rangeCheck(index);
            int arrnums=size-index-1;
            Object oldValue=elementData[index];
            if(arrnums>0){
                System.arraycopy(elementData, index+1, elementData,index, arrnums);
            }
            elementData[--size]=null;
            return oldValue;
        }   

    public boolean remove(Object obj){
        /*
         * 1.删除指定对象
         * 2.通过遍历
         * 3.equals的底层运用,找到下标,调用remove(int i)
         */
        for(int i=0;i<size;i++){
            if(get(i).equals(obj)){         //注意底层用的是equals不是“==”
                remove(i);
            }
            break;
        }
        return true;
    }

    public Object set(int index,Object obj){
        /*
         * 1.将指定下标的对象改变
         * 2.下标合法性检查
         * 3.直接通过数组的赋值来实现改变
         * 4.返回旧值
         */
        rangeCheck(index);
        Object oldValue=elementData[index];
        elementData[index]=obj;
        return oldValue;
    }

    private void rangeCheck(int index){
        /*
         * 对下标的检查
         */
        if(index<0||index>=size){
            try {
                throw new Exception();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private void ensureCapacity(){
        /*
         * 1.对容器容量的检查
         * 2.数组扩容,通过数组复制来实现(量和值两者都要保障)
         */
        if(size==elementData.length){
            Object[] newArray=new Object[size*2+1];
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData=newArray;
        }
    }
    public static void main(String[] args) {
        MyArrayList mylist=new MyArrayList();
        mylist.add("123");  
        mylist.add("呵呵呵");
        mylist.add("哦哦");
        mylist.add("哈哈哈");
        mylist.add(1,"你好");
        String old=(String)mylist.remove(3);    //返回的是旧值
        System.out.println(old);
        System.out.println(mylist.remove("哦哦"));                    
        System.out.println(mylist.isEmpty());
        System.out.println(mylist.get(1));
        System.out.println(mylist.size());
        System.out.println(mylist.set(2, "你好啊"));   //返回旧值
        System.out.println(mylist.get(2));
    }
}

输出:

哦哦
true
false
你好
4
呵呵呵
你好啊

ArrayList底层实现是数组,查询快,修改、删除、插入慢, 线程不安全,效率较高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值