关于数组的扩容

基本数据类型数组的扩容和缩容:

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()+"	"+stu[i].getAge()+"	"+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()+"	"+stu[i].getAge()+"	"+stu[i].getGender());
        }
        
        //对象数组的缩容
        System.out.println("数组缩容前打印输出:");
        for(int i=0;i<stu.length;i++){
            System.out.println(stu[i].getName()+"	"+stu[i].getAge()+"	"+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()+"	"+stu[i].getAge()+"	"+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 男

原文地址:https://www.cnblogs.com/mqq123/p/8059707.html