java中创建一个自己的数组

创建一个自己的数组
首先明确我们的数组都有什么功能

功能:
1.插入:向索引位置插入一个元素,后面的元素往后平移,由此还可以引申出头部添加元素,尾部添加元素两个功能
2.删除:删除某个索引的元素,并把后面的元素整体前移,由此还可以引申出删除头部元素,删除尾部元素
3.获取:获取数组实际长度,获取数组容量,获取数组索引对应的值,获取由值对应的索引
4.判断:判断数组是否为空,判断是否含有某个元素
5.修改:修改索引位置的值
6.toString:重写toString方法,把数组中的元素转换成String类型便于显示出
7.resize():重新为数组设置容积
为什么要重新设置容积呢?是为了处理当数组已满或者数组有太多空闲容量的情况。当数组已满时,由于我们不知道用户还要添加多少个数组,把容积设置成+1,+n都不合适,所以我们要给他添加到原先容积的2倍。当数组删除元素后有太多空闲容量时,我们需要让数组容积变成原先的1/4,因为如果变成1/2的话,万一用户刚删除完一个又添加一个元素,然后又删除一个又添加一个元素的话,这样子就需要一会变一下容积一会变一下容积,这样子变容积很繁琐,所以变成原先的1/4更合适点。
泛型:
我们的数组不仅是能存放int类型,当传参传入什么类型时,就应该保存什么类型,所以我们需要用到泛型

public class MyArrary<T> {
    private T[] value;    //保存数据
    int size;   //实际存放个数
    int capacity;   //容积

    //  构造方法
    public MyArrary(int capacity){
        if(capacity<=0){
            this.capacity=10;
        }else {
            this.capacity=capacity;
        }
        this.size=0;
        this.value=(T[])(new Object[this.capacity]);
        //不可以直接new一个T[]类型,所以需要先new一个Object[]类型然后转为T[]
    }

    //获取实际长度
    public int getSize() {
        return this.size;
    }

    //获取数组的容积
    public int getCapacity() {
        return this.capacity;
    }

    //判断数组是否为空
    public boolean ifnull(){
        return this.size==0;
    }

    //向数组中添加元素
    //this.size是指向待插入元素的索引
    public void adddata(T data){
        insert(this.size,data);
    }

    //修改指定位置的值
    public void modify(int index,T data){
        if(index<0||index>capacity){
            throw new IllegalArgumentException("index is invalid.");
        }
        this.value[index]=data;
    }

    //插入元素
    public void insert(int index,T data){
        if(index<0||index>this.capacity){
            throw new IllegalArgumentException("index is invalid.");
        }
        if(this.size==this.capacity){   //如果数组满了就重新设置容积
            resize(2*this.capacity);
        }
        for(int i=this.size;i>index;i--){   //从末尾size开始往回遍历,第i个等于i-1个
            this.value[i]=this.value[i-1];
        }
        this.size++;
        this.value[index]=data;
    }

    //删除索引位置元素
    public void delete(int index){
        if(index<0||index>this.capacity){
            throw new IllegalArgumentException("index is invalid.");
        }
        if(this.size<=this.capacity/4){     //如果数组的实际长度比容积的1/4还小说明浪费了太多空间需要重新设置容积
            resize(this.capacity/2);
        }
        for(int i=index;i<this.size-1;i++){     //从索引开始第i个等于i+1个
            this.value[i]=this.value[i+1];
        }
        this.size--;
    }

    //获取索引位置的值
    public T getindexdata(int index){
        if(index<0||index>this.capacity){
            throw new IllegalArgumentException("index is invalid.");
        }
        return this.value[index];
    }

    //根据值获取索引
    public int getindex(T data){
        for (int i = 0; i < this.size; i++) {
            if(data==this.value[i]){
                return i;
            }
        }
        return -1;
    }

    //向头部添加元素
    public void inserttop(T data){
        insert(0,data);
    }

    @Override
    public String toString() {
        StringBuilder s=new StringBuilder();    //需要用到StringBuilder的append来添加'[',']',','
        s.append("[");
        for (int i = 0; i < this.size; i++) {
            s.append(this.value[i]);
            if(i!=this.size-1) {
                s.append(",");
            }
        }
        s.append("]");
        String string=s.toString();     //把StringBuilder转换成String
        return string;
    }

    //是否包含某元素
    public boolean contain(T data){
        for (int i = 0; i < this.size; i++) {
            if(data==this.value[i]){
                return true;
            }
        }
        return false;
    }

    //重新给容积
    private void resize(int newcapacity){
        //由于数组的容积都是不变的所以需要新建一个数组
        T [] newvalue=(T[])(new Object[newcapacity]);
        //转移数组
        for (int i = 0; i < this.size; i++) {
            newvalue[i]=this.value[i];
        }
        //改变容器,数组
        this.value=newvalue;
        this.capacity=newcapacity;
    }
}