Java自定义长度可变数组的操作
我们都知道数组是线性的、类型固定、内存地址连续、定长的,主要是数组一旦被定义,那么它的长度也就定下来了,只能添加有限的数据。而长度可变的数组是要将这个长度打破,实现数组数据无限增加
那么定义长度可变的数组就可以用两个数组来实现数组长度的变化。为了避免每次增加数据或删除数据时都要重新开辟空间,我先设定原数组为固定长,在当数组放满时,一次增加一定的长度,这样节省了开辟空间的时间
因为数组里的数据类型是不确定的,所以用泛型比较好
publicclassMyList{ privateintrongliang;//容量 privateintzengliang;//增量 privateintnum;//数量 //定义一个原数组 //Object类包含所有的类型,所以定义数组是用Object类 privateObject[]src; //三个不同的构造方法 publicMyList(){ this(10,10); } publicMyList(introngliang){ this(rongliang,10); } publicMyList(introngliang,intzengliang){ this.rongliang=rongliang; this.zengliang=zengliang; src=newObject[rongliang]; } } 
在MyList中实现在数组中添加数据,要考虑到数组中的数据数量小于数组长度时,可以直接在数组为null处添加数据,但当数组的数量大于等于数组长度时,要先重新定义一个数组,长度是原数组加增量,然后再添加数据
publicvoidadd(Es){
//判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容
if(num>=src.length){
//定义一个新的数组,长度是原有的长度加增量
Objectarr[]=newObject[src.length+zengliang];
//拷贝数组数据
System.arraycopy(arr,0,arr,0,src.length);
src=arr;
}
//如果num不大于数组的长度,则不需扩容,直接加入
//如果num大于等于数组长度,则需执行上面的if语句扩容,再加入数据
//最后num++
src[num++]=s;
}
取出指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常
publicEget(intindex){
//抛出异常
if(index<0||index>=num){
thrownewIndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
}
//强制转换成E类型
return(E)src[index];
}
修改指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常
publicvoidmodify(intindex,Es){
//抛出异常
if(index<0||index>=num){
thrownewIndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
}
src[index]=s;
}
删除指定下标的数据,当数组中null值的长度大于等于增量时,要将数组的容量减小,防止浪费
publicvoiddelete(intindex){
//抛出异常
if(index<0||index>=num){
thrownewIndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
}
//将>index的数据依次向前移动一位
System.arraycopy(src,index+1,src,index,num-index-1);
num--;
//减少容量的方法
if(src.length-num>=zengliang){
//定义一个新的数组,长度是原先数组的长度减去增量
Objectarr[]=newObject[src.length-zengliang];
//拷贝数组
System.arraycopy(src,0,arr,0,num);
src=arr;
}
}
将指定下标处的数据改为指定的数据
publicvoidinsert(intindex,Es){
//抛出异常
if(index<0||index>=num){
thrownewIndexOutOfBoundsException("下标越界!index:"+index+",size:"+num);
}
//判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容
if(num>=src.length){
//定义一个新的数组,长度是原有的长度加增量
Objectarr[]=newObject[src.length+zengliang];
//拷贝数组数据
System.arraycopy(src,0,arr,0,src.length);
src=arr;
}
//将>index的数据依次向后移动一个位置
//arraycopy()是可以将数据自己拷贝给自己
System.arraycopy(src,index,src,index+1,num-index);
//插入数据
src[index]=s;
num++;
}
最后在写个获取数组中数据的个数,而不是数组的长度
publicintsize(){
returnnum;
}
写个测试类,来测试这个长度可变的数组是否可行
publicclasstest{
publicstaticvoidmain(String[]args){
//创建一个MyList对象
//在创建对象时明确类型
MyListlist=newMyList();
//添加数据
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("g");
list.add("h");
list.add("i");
list.add("j");
//遍历数组
for(inti=0;i
最终数组的结果为:
abcdefghij
数据个数为:10
**********************************************
aQQcdefghij
数据个数为:10
**********************************************
aQQdefghij
数据个数为:9
**********************************************
aQQdqizrefghij
数据个数为:11
**********************************************
补充:在Java中创建一个自定义长度的数组并输入每个元素
用到知识点:数组、方法、Scanner、for循环。
作业:
packageArray;
importjava.util.Scanner;
publicclassInputArray{
publicstaticvoidmain(String[]args){
shuzu();//方法调用
}
//方法定义
publicstaticvoidshuzu(){
//将输入的数字作为数组的长度
Scannersz=newScanner(System.in);
System.out.println("请输入数组长度:");//提示可以操作
int[]cd=newint[sz.nextInt()];//数组初始化完成
System.out.println("当前数组长度定义为:"+cd.length);//再提示一下结果
//用for循环为每一个元素赋值
for(inti=0;i
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
    