Java数据结构(3)- 数组
1、容器容器:什么是容器,容器是一种基础工具。泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。通俗一点讲,就是用来装东西的,可以存放物体。而再java’语言当中什么是容器,容器就是用来装数据的,存储数据的容器。2、数组何为数组,从字面上来理解,就是一组数字,一组数据。数组作为一种基本容器,可以在jvm虚...
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,效率有些低下。
更多推荐
所有评论(0)