ArrayList的相关说明||自己实现ArrayList代码

ArrayList的说明及实现

说明

对于ArrayList他的底层是结构其实是数组,那它与数组的区别在哪呢?
它多了一个变量usedSize即有效长度,数组的长度并不代表的它的有效长度,我们从ArrayList的源码可以看到
ArrayList不带参数的构造方法
它并没有为它的底层结构分配内存,那数据是如何分配的?
其实它的内存大小的初始值是在执行它的add()函数时才有的:初始值为10

注意事项

**删除某一位置元素:**在删除某一位置的元素时,我们采用将后一个元素依次前移将其覆盖的方式,当数组下标移动到usedSize-1时,即最后一个元素,不能再采用elem[i]=elem[i+1],应为elem[i+1]已经超过了有效范围,此时会报错,我们只需要将usedSize-1即可,后面再进行相关操作时将其覆盖即可。同时注意在此之前判断数组是否为空。
**在某位置插入元素:**与删除某一位置的元素不同的地方是,删除时是将元素从删除位置的后一个逐渐前移,达到覆盖的效果,而插入时是从最后一个元素开始逐渐向后移动,当然在进行新增元素时,要先判度数组是否已满,若已满,则要进行扩容操作即:
扩容操作
**与位置相关的:**只要涉及到位置,我们就要先判断位置是否合法;在位置不合法时自定义异常,然后抛出异常,在主函数中有可能发生异常的代码块用try…catch包裹起来即:
位置不合法,抛出异常

try.....catch处理异常

完整代码

import java.util.Arrays;

class myArrayList{
    private int[] elem;
    private int usedSize;

    public myArrayList(int[] elem, int usedSize) {
        this.elem = elem;
        this.usedSize = usedSize;
    }
    // 打印顺序表
    public void mytoString() {
        for (int i=0;i<usedSize;i++){
            System.out.print(elem[i]+" ");
        }
    }
    public boolean isFull(){
        if(elem.length==usedSize){
            return true;
        }
        return false;
    }
    // 新增元素,默认在数组最后新增
    public void add(int data) {
        if(isFull()){
            this.elem= Arrays.copyOf(this.elem,2*this.elem.length);
        }
        elem [usedSize]=data;
        usedSize++;

    }
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(pos<0||pos>usedSize){
            System.out.println("位置输入错误!");
            throw new RuntimeException("位置输入错误");
        }
        if (isFull()){
            this.elem=Arrays.copyOf(this.elem,2*this.elem.length);
        }
        for(int i=usedSize-1;i>=pos;i--){
            elem[i+1]=elem[i];
        }
        elem[pos]=data;
        usedSize++;
    }
    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i=0;i<usedSize;i++){
            if(elem[i]==toFind){
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }
    // 获取 pos 位置的元素
    public int get(int pos) {
        if(pos<0||pos>usedSize){
            System.out.println("位置输入错误!");
            throw new RuntimeException("位置输入错误");
        }
        return elem[pos];
    }
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if(pos<0||pos>usedSize){
            System.out.println("位置输入错误!");
            throw new RuntimeException("位置输入错误");
        }
        elem[pos]=value;

    }
     public boolean isEmpty(){
        if(usedSize==0){
            return true;
        }
        return  false;
    }
    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        if(isEmpty()){
            return;
        }
        int index=indexOf(toRemove);
        for (int i=index;i<usedSize-1;i++){
            elem[i]=elem[i+1];
        }
        usedSize--;

    }
    // 获取顺序表长度
    public int size() {
        return usedSize;
    }
    // 清空顺序表
    public void clear() {
        usedSize=0;
    }
}
public class TestArrayList {
    public static void main(String[] args) {
        int[] array=new int[10];
        myArrayList myarraylist=new myArrayList(array,0);
        myarraylist.add(1);
        myarraylist.add(2);
        myarraylist.add(3);
        myarraylist.add(4);
        System.out.println("输出全部元素");
        myarraylist.mytoString();
        System.out.println();
        System.out.println("向固定位置添加元素");
        myarraylist.add(2,5);
        myarraylist.mytoString();
        System.out.println();
        System.out.println("设置某位置元素");
        try {
            myarraylist.set(4, 7);
            System.out.println("获取某位置的元素");
            System.out.println(myarraylist.get(4));
        }catch(RuntimeException e){
            e.printStackTrace();
        }
        myarraylist.mytoString();
        System.out.println();
        System.out.println("判度是否包含");
        System.out.println(myarraylist.contains(6));
        System.out.println("删除");
        myarraylist.remove(3);
        myarraylist.mytoString();
        System.out.println();
        System.out.println("顺序表长度");
        System.out.println(myarraylist.size());
        System.out.println("清空");
        myarraylist.clear();
        myarraylist.mytoString();


    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值