ArrayList的手工实现

这篇博客介绍了如何手动实现一个类似ArrayList的Java类SsqArrayList,包括构造器、添加、删除和遍历元素的方法,以及toString和set/get操作。作者通过示例展示了如何处理数组扩容和异常检查。
摘要由CSDN通过智能技术生成
package cn.test;
//手工实现Arraylist,参照ArrayList的方法类

public class SsqArrayList<E> {
    private int size;//包含元素的数量
    private Object[] elementData;//目标数组

    private static final int DEFAULT_CAPACITY=10;

    public SsqArrayList(){
        elementData = new Object[DEFAULT_CAPACITY];//当定义时未指定数组范围,取默认值为10
    }

    public SsqArrayList(int capacity){//不可为负数,为负数时抛出异常
        elementData = new Object[capacity];
    }

    public void add(E element){
        //越界时对数组进行扩容
        if(size==elementData.length){
            Object[] newArray = new Object[elementData.length+
                    (elementData.length>>1)];//位运算符“>>”与加法运算优先级一致,故须用括号
                    //为防止占用过多空间,扩容时扩展至原容量的3/2
            if(size<=1){//数组长度为1或0时的特殊情况
                newArray = new Object[size+1];
            }
            System.arraycopy(elementData,0,newArray,0,size);
            elementData=newArray;

        }

        elementData[size++]=element;
    }

    @Override
    public String toString() {//toString方法的重载
        if(elementData==null)
            return null;
        if(size-1==-1)
            return "[]";

        StringBuilder x = new StringBuilder();
        x.append('[');
        for(int i=0;i<size;i++)
        {
            x.append(elementData[i]+",");
        }
        x.setCharAt(x.length()-1,']');
        return x.toString();
    }

    public void set(int index,Object element){//改变指定元素
        //判断下标是否合法[0,length)
        if(index<0||index>=elementData.length)
            //不合法
            throw new RuntimeException("下标不合法");
        elementData[index]=element;
    }
    public E get(int index){//按下标取元素
        return (E)elementData[index];//elementData是Object型,应强制转为E型
    }

    public void remove(int index){//按下标删除(假设下标合法)
        if(size-index-1>0)//当数组中仅有一个元素或要删除的元素位于队尾时,不需要进行序列的前移
            System.arraycopy(elementData,index+1,elementData,index,size-index-1);
        elementData[--size]=null;
    }

    public void remove(Object element){//按元素删除
        for(int i=0;i<size;i++){
            if(element.equals(elementData[i]))
                remove(i);
        }
    }

    public static void main(String[] args) {
        SsqArrayList s = new SsqArrayList();
        System.out.println(s);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值