//...
List<String> allList = new ArrayList<String>();
allList.add("111");
allList.add("222");
allList.add("333");
allList.add("444");
String str1[] = allList.toArray(new String[]{});  //这里 new String[]{} 怎么理解 ?
for(int i = 0; i < str1.length; i++){          //文档里是<T> T[] toArray(T[] a)
    System.out.print(str1[i] + " ");         // 具体解释下这个泛型
}System.out.println();//换行Object str2[] = allList.toArray();

if(str2 instanceof String[]){
    System.out.println("Yes"); //为什么这里不是String[] 的实例 ?
}
//String str3[] = (String)str2;       //不能转型 ?
for(int i = 0; i < str2.length; i++){ 
    String str4 = (String)str2[i];    //这里为什么可以转型 ?
    System.out.print(str4 + " ");
}

解决方案 »

  1.   

    String str1[] = allList.toArray(new String[]{}); //这里 new String[]{} 怎么理解 ?
    for(int i = 0; i < str1.length; i++){ //文档里是<T> T[] toArray(T[] a)
      System.out.print(str1[i] + " "); // 具体解释下这个泛型
    }

    new String[]{}和new String[0]是一个意思,就是new一个String数组对象,数组长度为0,{}就表示没有任何元素
    Object str2[] = allList.toArray(); if(str2 instanceof String[]){
      System.out.println("Yes"); //为什么这里不是String[] 的实例 ?
    }
    //String str3[] = (String)str2; //不能转型 ?
    for(int i = 0; i < str2.length; i++){  
      String str4 = (String)str2[i]; //这里为什么可以转型 ?
    Object str2[] = allList.toArray(); 这里返回的是Object[]数组对象,也就是说str2指向一个Object数组对象
    Object数组和String数组是不同的数组对象,所以str2 instanceof String[]是false
    所以String str3[] = (String)str2; //不能转型,即不能把Object[]对象强行转换成String[]对象
    String str4 = (String)str2[i]; 这是数组和数组元素的区别,str2虽然指向Object数组对象,但是该对象的元素都是String对象,所以可以把数组元素str2[i]强行转换成String str4
      

  2.   

    来晚了,ls已经回答很清楚了,lz加油
      

  3.   

    我是问 toArray()括号里 为什么要这样写
      

  4.   

    我是问 toArray()括号里 为什么要这样写
      

  5.   

    将List<String>数组,变成String[] 字符串数组,你要学会查API~方法的说明还有什么好问的,API上写得不是很清楚吗?
      

  6.   

    因为该方法需要一个数组参数,LZ可以自己查看文档,toArray(T[] a),说明该方法规定,它的参数是一个T类型的数组,T表示泛型,所以,对于String类型,就要传入String[]数组的参数
      

  7.   


    我试了下 在 new String[] 中括号里 写 0、1、2、3、4 输出的结果是 111 222 333 444如果输入 5以上的 就会输出 111 222 333 444 null     5 以后都是null如果不输入数组长度就会报错 。 照你说的 请问下 在输入0、1、2、3 时不会出现数组越界吗
      

  8.   

    我试了下 在 new String[] 中括号里 写 0、1、2、3、4 输出的结果是 111 222 333 444如果输入 5以上的 就会输出 111 222 333 444 null 5 以后都是null如果不输入数组长度就会报错 。 请问下 在输入0、1、2、3 时不会出现数组越界吗还是我完全理解错了 刚学java 请高手指点
      

  9.   

    LZ可以自己查看源码的实现 public <T> T[] toArray(T[] a) {
            if (a.length < size)
                // Make a new array of a's runtime type, but my contents:
                return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }当参数数组的长度小于List对象的长度时,直接返回(T[]) Arrays.copyOf(elementData, size, a.getClass());
    就是把List的内部数组的元素直接复制一份返回,所以你输入0,1,2,3都会走到这个逻辑里
    当参数的数组元素大于或等于List元素的个数的时候
    首先按照List元素的个数对数组进行复制System.arraycopy(elementData, 0, a, 0, size);
    然后判断如果参数数组的长度大于List元素个数的时候,大于List元素个数的紧接着的数组元素赋值null,即a[size] = null; 而因为输出参数的时候,用new的方式传入数组,数组元素本身是null,所有就会觉得数组的后面的元素都是null
    如果不输出数组的长度,那么new会报错,这个应该很容易理解
    比如 String s = new String[]; //不指定数组长度,自然不能编译通过
    而String s = new String[]{};//这样的new,看上去好像没有指定长度,实际上{}就是指定了长度,因为{}里面的值就决定数组的长度,所以{}表示没有元素,即长度为0,{"xx"}表示有1个元素,即长度为1,依次类推
    LZ可以试着改成这样
    String str1[] = allList.toArray(new String[]{"1", "2", "3", "4", "5", null, "7"});
    然后打印 System.out.println(Arrays.toString(str1));//看看结果是什么?
      

  10.   


    哦 有点懂了。那个源码开始我也看了,就是看不懂 ,呵呵。 我刚学java 不知什么时候能到你的水平 能给点学习建议不 ?  谢谢啦 O(∩_∩)O~