Java 核心技术(第八版)卷1:基础知识:例5-8P196ArrayGrowTest

import java.lang.reflect.*;
//本程序演示了用反射来操纵数组
public class ArrayGrowTest {
    public static void main(String[] args)
    {
        int[] a={1,2,3};
        a=(int[]) goodArrayGrow(a);
        arrayPrint(a);

        String [] b={"Tom","Dick","Harry"};
        b=(String[]) goodArrayGrow(b);
        arrayPrint(b);
      //  System.out.println("The following call will generate an exception.");
      //  b=(String[]) badArrayGrow(b);
    }
    //本程序试图通过分配一个新的数组,然后草被所有的元素实现 增长一个数组(为数组扩容)
    //为什么这么做不好呢?因为 这个创建数组的语句是:Object[] newArray=new Object[newLength] 这样
    //创建的数组是Object[] ,这个数组是不能转换为其他类型的数组的。
    static Object[] badArrayGrow(Object[] a)
    {
        int newLength=a.length*11/10+10;
        Object[] newArray=new Object[newLength];
        System.arraycopy(a,0,newArray,0,a.length);
        return newArray;
    }
    //本方法通过分配一个新的同样类型的数组 然后拷贝所有的元素.请注意这个same type 同样的类型 这个是关键
    static Object goodArrayGrow(Object a)
    {
        Class cl=a.getClass();
        if(!cl.isArray())return  null;
        Class componentType=cl.getComponentType();
        int length=Array.getLength(a);
        int newLength=length*11/10+10;

        Object newArray=Array.newInstance(componentType,newLength);
        System.arraycopy(a,0,newArray,0,length);
        return newArray;
    }
    //打印数组中的元素
    static void arrayPrint(Object a)
    {
        Class cl=a.getClass();
        if(!cl.isArray()) return ;
        Class componentType=cl.getComponentType();
        int length=Array.getLength(a);
        System.out.print(componentType.getName()+"["+length+"]={");
        for(int i=0;i<Array.getLength(a);i++)
        {
            System.out.print(Array.get(a,i)+" ");
        }
        System.out.println("}");
    }
}

运行结果:

int[13]={1 2 3 0 0 0 0 0 0 0 0 0 0 }
java.lang.String[13]={Tom Dick Harry null null null null null null null null null null }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值