Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便,比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都可能会有学生入学、退学或转学),所以需要有一个足够大的数组来容纳所有的学生,但问题是多大才算足够大?10年前一台台式机64MB的内存已经很牛了,现在要是没有2GB的内存你都不好意思跟别人交流计算机的配置,所以呀,这个足够大是相对于当时的场景而言的。随着环境的变化,“足够大”也可能会转变成“足够小”,然后就会出现超出数组最大容量的情况,那该如何解决呢?事实上,可以通过对数组扩容“婉转”地解决该问题,代码如下:
public static<T>TexpandCapacity(Tdatas, int newLen){
//不能是负值
newLen=newLen<0?0:newLen;
//生成一个新数组,并拷贝原值
return Arrays.copyOf(datas, newLen);
}
上述代码中采用的是Arrays数组工具类的copyOf方法,产生了一个newLen长度的新数组,并把原有的值拷贝了进去,之后就可以对超长的元素进行赋值了(依据类型的不同分别赋值为0、false或null),使用方法如下:
public static void main(Stringargs){
//一个班级最多容量60个学生
Stuclasses=new Stu[60];
/*classes初始化……*/
//偶尔一个班级可以容纳80人,数组加长
classes=expandCapacity(classes,80);
/*重新初始化超过限额的20人……*/
}
通过这样的处理方式,曲折地解决了数组的变长问题。其实,集合的长度自动维护功能的原理与此类似。在实际开发中,如果确实需要变长的数据集,数组也是在考虑范围之内的,不能因固定长度而将其否定之。