基本数据类型数组的扩容和缩容:
package test; /** * 实现基本数据类型数组的扩容和缩容 * @author admin * */ /*因为java中数组是固定的,不变是不能动态扩容的, 想要插入一个数必然要重新创建一个数组,其长度比原数组大, 然后对其进行拷贝,接下来要做的工作就是在新数组里面实现插入。*/ public class ArrayTest { public static void main(String[] args) { // TODO Auto-generated method stub //定义一个长度为5的普通数组 int[] arr ={5,1,4,2,6}; System.out.print("扩容前的数组:"); for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); //定义一个新的数组,长度为当前数组的长度加一 int[] temp1 = new int[arr.length+1]; //通过循环将当前数组的值赋给临时数组 for(int i=0;i<arr.length;i++){ temp1[i] = arr[i]; } //将需要添加的值添加到临时数组的最后以为,即temp.length-1 temp1[temp1.length-1] = 0; //最后将临时数组的值赋给当前数组 arr = temp1; //最后将数组打印一遍,看添加是否成功 System.out.print("扩容后的数组:"); for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); //接下来就是数组的缩容 //还是使用当前数组arr ,因为前面扩容的原因,它现在的长度为6 System.out.print("缩容前的数组:"); for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); //先定义一个临时数组,长度比arr要小一 int[] temp2 = new int[arr.length-1]; //加入你现在需要去掉数组下标为3的值 for(int i=0; i<temp2.length;i++){ //先判断数组下标的值,如果小于将于去掉值的下标则将arr数组的值赋给temp2, //一旦不满足条件后,temp2的当前下标值获取arr数组的下一个下标值 if(i<3){ temp2[i] = arr[i]; }else{ temp2[i] = arr[i+1]; } } arr = temp2; //最后将数组打印一遍,看添加是否成功 System.out.print("缩容后的数组:"); for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } } }
输出结果:
扩容前的数组:5 1 4 2 6
扩容后的数组:5 1 4 2 6 0
缩容前的数组:5 1 4 2 6 0
缩容后的数组:5 1 4 6 0
然后是对象数组的扩容和缩容:
package test; /** * 对象数组的扩容和缩容 * @author admin * */ public class ObjectArray { public static void main(String[] args) { // TODO Auto-generated method stub Data data = new Data(); Student[] stu = data.setData(); System.out.println("数组扩容前打印输出:"); for(int i=0;i<stu.length;i++){ System.out.println(stu[i].getName()+"\t"+stu[i].getAge()+"\t"+stu[i].getGender()); } //对象数组的扩容 Student[] temp1 = new Student[stu.length+1]; //与普通数组扩容大致步骤相同 for(int i=0;i<stu.length;i++){ temp1[i] = stu[i]; } //创建需要加入对象数组的数据,并将其插入临时独享数组最后一位 Student stu2 = new Student(); stu2.setName("小王"); stu2.setAge(18); stu2.setGender("男"); //不能给对象数组的最后一位单独赋值,因为最后一位开始只是申明的这个对象并没有具体的指向地址,直接赋值会产生空指针错误 temp1[temp1.length-1] = stu2; //将temp1的值赋给原对象数组 stu = temp1; System.out.println("数组扩容后打印输出:"); for(int i=0;i<stu.length;i++){ System.out.println(stu[i].getName()+"\t"+stu[i].getAge()+"\t"+stu[i].getGender()); } //对象数组的缩容 System.out.println("数组缩容前打印输出:"); for(int i=0;i<stu.length;i++){ System.out.println(stu[i].getName()+"\t"+stu[i].getAge()+"\t"+stu[i].getGender()); } //创建一个Student对象数组,长度为stu对象数组长度减一 Student[] temp2 = new Student[stu.length-1]; //对象数组的缩容与普通数组并没有什么差别 //这次是需要去掉数组下标为2的值 ////从下标2开始,后面一位往前移动一位 for(int i=2;i<stu.length-1;i++){ stu[i] = stu[i+1]; } //将当前对象数组前temp2的长度位的值赋给temp2,也就这stu的最后一个值并不赋给temp2数组 for(int i=0;i<temp2.length;i++){ temp2[i] = stu[i]; } //将temp2的值赋给原对象数组 stu = temp2; System.out.println("数组缩容后打印输出:"); for(int i=0;i<stu.length;i++){ System.out.println(stu[i].getName()+"\t"+stu[i].getAge()+"\t"+stu[i].getGender()); } } } class Student{ private String name; private int age; private String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } } class Data{ /** * 返回Student类型的对象数组 * @return stu[] */ public Student[] setData(){ //创建对象并赋值 Student stu1 = new Student(); stu1.setName("张三"); stu1.setAge(18); stu1.setGender("男"); Student stu2 = new Student(); stu2.setName("李四"); stu2.setAge(17); stu2.setGender("男"); Student stu3 = new Student(); stu3.setName("小琴"); stu3.setAge(18); stu3.setGender("女"); //将对象的值添加进入对象数组中 Student[] stu = new Student[3]; stu[0] = stu1; stu[1] = stu2; stu[2] = stu3; return stu; } }
结果为:
数组扩容前打印输出:
张三 18 男
李四 17 男
小琴 18 女
数组扩容后打印输出:
张三 18 男
李四 17 男
小琴 18 女
小王 18 男
数组缩容前打印输出:
张三 18 男
李四 17 男
小琴 18 女
小王 18 男
数组缩容后打印输出:
张三 18 男
李四 17 男
小王 18 男