java用数组模拟实现ArrayList以及一些常用方法实现

1 篇文章 0 订阅
package com.yys.student;

/**
 * Created by yys on 2017/5/4.
 */
public class SxtArrayList {
    private Object[] elementDate;
    private int size;
    /**
     * 默认无参构造方法 SxtArrayList()
     */
    public SxtArrayList(){
    this(10);
    }
    /**
     * 默认带参构造方法 SxtArrayList(int initialCapacity)
     */
    public SxtArrayList(int initialCapacity){
        if(initialCapacity<0){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        elementDate = new Object[initialCapacity];
    }
    /**
     * 返回list大小 size()
     * 返回SxtArrayList对象大小即SxtArrayList中数组大小
     */
    public int size(){
        return size;
    }
    /**
     * 判断list是否为空 isEmpty() 此方法待改进 初始化时并未使用size 只有add时候用到size属性 直接判断size不正确
     * 返回SxtArrayList对象是否为空即SxtArrayList中数组中是否有实际值
     */
    public boolean isEmpty(){
        return size == 0;
    }
    /**
     * 新增对象 add(Object obj)
     * ensureCapacity()检查数组是否需要数组扩容和数据拷贝 后添加元素
     * 返回 null
     */
    public void add(Object obj){
        //数组扩容和数据拷贝
        ensureCapacity();
        elementDate[size++] = obj;
    }
    /**
     * 指定位置新增对象 原来此位置对象后移 add(int index , Object object)
     * rangeCheck(index)检验数组下标是否越界
     * ensureCapacity()检查数组是否需要数组扩容和数据拷贝
     * 然后进行原来数组内容向后移动
     * 最后把新值传入相应位置
     * 数组长度++
     * 返回 null
     */
    public void add(int index , Object object){
        //检验数组下标是否越界
        rangeCheck(index);
        //数组扩容和数据拷贝
        ensureCapacity();
        //第一个是要复制的数组,第二个是从要复制的数组的第几个开始,
        //第三个是复制到那,四个是复制到的数组第几个开始,最后一个是复制长度
        System.arraycopy(elementDate,index,elementDate,index+1 ,size-index);
        elementDate[index] = object;
        size++;
    }
    /**
     * 获取指定位置对象 get()
     * rangeCheck(index)检验数组下标是否越界
     * 返回数组对应值(object)
     */
    public Object get(int index){
        rangeCheck(index);
        return elementDate[index];
    }
    /**
     * 删除指定位置对象 remove(int index)
     * rangeCheck(index)检验数组下标是否越界
     * 删除对象前计算出要删除的对象后面还剩多少对象以便于后面元素向前移动
     * 移动对象
     * 原数组最后一位设置为空
     * 如果删除对象在数组最后一位则直接删除无需数组元素移动
     * 返回 null
     */
    public void remove(int index){
        rangeCheck(index);
        int numMove = size - index -1;
        if(numMove > 0){
            //第一个是要复制的数组,第二个是从要复制的数组的第几个开始,
            //第三个是复制到那,四个是复制到的数组第几个开始,最后一个是复制长度
            System.arraycopy(elementDate,index +1,elementDate,index,numMove);
            elementDate[--size] = null;
        }else if(numMove == 0){
            elementDate[--size] = null;
        }
    }
    /**
     * 重新设置指定位置对象 set(int index,Object object)
     * rangeCheck(index)检验数组下标是否越界
     * 获取对应下标对象 暂定为旧对象
     * 对应下标对象重新赋值
     * 返回 旧对象
     */
    public Object set(int index,Object object){
        rangeCheck(index);
        Object oldValue = elementDate[index];
        elementDate[index] = object;
        return oldValue;
    }
    /**
     * 删除指定对象 remove(Object obj)
     * 判断传入对象是否存在
     * 如果存在则会得到相应下标位置
     * 利用下标位置删除此元素
     * 返回 null
     */
    public void remove(Object obj){
        for(int i=0;i<size;i++){
            if(get(i).equals(obj)){//底层是equls
                remove(i);
            }
        }
    }
    /**
     * 检验数组下标是否越界
     */
    private void rangeCheck(int index){
        if(index<0 || index>=size){
            try {
                throw new Exception("下标越界");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 数组扩容和数据拷贝
     */
    private void ensureCapacity(){
        if(size==elementDate.length){
            Object[] newArray = new Object[size*2+1];
            System.arraycopy(elementDate,0,newArray,0,elementDate.length);
//            System.arraycopy()代替for循环
//            for(int i=0;i<elementDate.length;i++){
//                newArray[i] = elementDate[i];
//            }
            elementDate = newArray;
        }
    }
    public static void main(String args[]){
        SxtArrayList sxtArrayList = new SxtArrayList(1);
        sxtArrayList.add("3");
        sxtArrayList.add(0,"2");
        sxtArrayList.add(0,"1");
        sxtArrayList.set(2,"4");
        for(int i=0;i<sxtArrayList.size();i++){
            System.out.println(sxtArrayList.get(i));
        }
        sxtArrayList.remove(0);
        sxtArrayList.remove("4");
        System.out.println("执行 remove(0) 和remove(\"4\")后剩余元素");
        for(int i=0;i<sxtArrayList.size();i++){
            System.out.println(sxtArrayList.get(i));
        }
        sxtArrayList.remove(0);
        System.out.println("执行 remove(0)否为空  "+sxtArrayList.isEmpty());
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值