Java数据结构(3)- 数组

1、容器

容器:什么是容器,容器是一种基础工具。泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。通俗一点讲,就是用来装东西的,可以存放物体。而再java’语言当中什么是容器,容器就是用来装数据的,存储数据的容器。

2、数组

何为数组,从字面上来理解,就是一组数字,一组数据。数组作为一种基本容器,可以在jvm虚拟机当中开辟一片连续的存储空间,并且是有序的,将数据存放在当中,通过索引的方式来查找删除修改数据

3、如何自定义一个容器

以前学习数组都是: 数据类型 变量名 = new 数据类型[长度],固定了长度,固定了类型。如果我们需要存储的数据是不同类型的怎么办?而且存储的数据个数也是不固定的,这个怎么办?今天我们就来解决这个问题,如果来定义一个不固定数据类型,不固定长度的数组。

//自定义的容器类
class MyContainer {
    //需要存储数据,所以我们需要定义一个数组在内部
    int[] arr;

    //定义一个构造方法,在创建容器对象的时候就给内部的数组赋值
    public MyContainer(){
        //自动创建一个数组对象,并且其长度为5
        this.arr = new int[5];
    }
    //定义一个size字段,来记录每次添加的元素
    int size = 0;
    //定义一个add方法,就收一个数据
    public void add(int data){
        //调用之后就将元素添加进去
        arr[size] = data;
        //添加完之后size的长度就自增1
        size++;
    }
    //覆写toString方法来打印数组的值
    @java.lang.Override
    public java.lang.String toString() {
        return "MyContainer{" +
                "arr=" + java.util.Arrays.toString(arr) +
                ", size=" + size +
                '}';
    }
}
//定义主方法,用来测试
public class Test{
    public static void main(String ars[]){
        //创建一个容器对象
        MyContainer my =  new MyContainer();
        my.add(1);
        my.add(2);
        my.add(3);
        my.add(4);

        System.out.println(my);
    }

}

在这里插入图片描述

元素被成功的插入进去了,但是我们主要的目的是能够实现,存储任意的类型,而且可以传多个数据,并且数组能够自动扩容

//定义主方法,用来测试
public class Test{
    public static void main(String ars[]){
        //创建一个容器对象
        MyContainer my =  new MyContainer();
        my.add(1,"123",456,123,456);
        my.add(1,"123",456,123,456);
        System.out.println(my);
    }

}
//自定义的容器类
class MyContainer {
    //将int类型改为Object类,所有类的父类,所以就可以存储所有类型,并且私有化起来
    private Object[] arr;

    //定义一个构造方法,在创建容器对象的时候就给内部的数组赋值
    public MyContainer(){
        //自动创建一个数组对象,并且其长度为5
        this.arr = new Object[5];
    }
    //定义一个size字段,来记录每次添加的元素
    int size = 0;
    //现在我需要能接收任意类型,任意长度,和自动扩容
    //1、如何接收任意类型呢?  定义Object类型,所有类型的父类
    //2、如何接收任意长度呢?  第一种方法:定义一个数组作为形式参数   第二种方法:使用可变参数 数据类型...变量名(本质还是数组)
    //3、这里我们采用第二种方法来作为形式参数
    //4、我们如何才能让数组自动扩容呢?看代码
    public void add(Object...data){
        //在添加元素之前我们还需要判断一下,数组当中已经有多少个元素了,并且空间能不能装下新传进来的数据
        int count = 0;
        for (Object obj:arr) {
            if(obj == null){
                count++;
            }
        }
        //首先判断,size每次添加就会加一次,就代表数组内的元素个数
        if(count < arr.length){
            //如果size等于数组的长度,那么就证明数组已经满了,我们需要扩容了
            //解决的方法就是new一个新的数组,长度就是传进来数组的长度,加上原来数组的长度
            Object[] newArrs = new Object[data.length+arr.length];
            //将老数组的元素拷贝到新的数组
            System.arraycopy(arr,0,newArrs,0,arr.length);
            //最后将新数组替换掉老的数组
            arr = newArrs;
        }

        //这里将元素添加进去就需要循环了,因为不确传进来数据的个数
        for (int i = 0; i < data.length;i++){
            arr[size] = data[i];
            size++;
        }
    }
 //覆写toString方法来打印数组的值
    @java.lang.Override
    public java.lang.String toString() {
        return "MyContainer{" +
                "arr=" + java.util.Arrays.toString(arr) +
                ", size=" + size +
                '}';
    }
}

在这里插入图片描述
添加成功了。。

总结:自定义容器,使用Object作为数组的类型,每次添加数据前,就判断一次,如果大于了当前参数数组的长度,就自动扩容,扩容就是new一个新的数组对象,数组就是对索引进行操作,但是每次扩容都会new,效率有些低下。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值