Java开发实战经典里P498有这段代码:import java.util.ArrayList ;
import java.util.List ;
public class ArrayListDemo04{
public static void main(String args[]){
List<String> allList = null ;
allList = new ArrayList<String>() ; // 指定操作的泛型为String
allList.add("Hello") ; // 此方法由Collection接口而来
allList.add(0,"World") ; // 在第一个位置上添加新的内容
allList.add("MLDN") ; // 向Collection中加入内容
allList.add("www.mldn.cn") ;
String str[] = allList.toArray(new String[]{}) ; // 指定好类型
System.out.print("指定数组类型:") ;
for(int i=0;i<str.length;i++){
System.out.print(str[i] + "、") ;
}
System.out.print("\n返回对象数组:") ;
Object obj [] = allList.toArray() ; // 返回Object类型
for(int i=0;i<obj.length;i++){
String temp = (String)obj[i] ; // 进行向下转型
System.out.print(temp + "、") ;
}
}
};请问 划红线那句代码什么意思??怎么使用了new String[]{}??

解决方案 »

  1.   

    该方法是根据集合中元素的类型,传入一个相同类型的零长度的数组。返回一个指定类型的数组。
    如果传入的数组类型与集合中的元素类型不相符那么就会抛出java.lang.ArrayStoreException异常
      

  2.   

    一楼正解。
    补充一下:如果只传入一个零长度的数组,就像代码中的那样“new String[]{}”,那么还需要在创建一个allList长度的String数组对象存储返回值,就会多创建一个零长度的String数组对象。
    假如传入把allList的长度也传入,就像这样“new String[allList.size()]”,那么allList的内容就会直接存入该数组对象,那么就少创建一个对象了。
      

  3.   

    谁来解释下为什么Java要用传0长度数组这种愚蠢的方法来实现简单的强类型数组转换?
      

  4.   

    因为java历史原因
    而又必须向下兼容,现在当然有泛型之类的,可以实现的更美一点但是在那个黑暗的21世纪(以下省略万字)
      

  5.   

    谁说用的不对。绝大多数实际使用的代码都是传0长度的数组。问题是你toArray就toArray呗,自动生成一个array就是了,还非要用户指定一个,指定的长度还是0,这不是笑话嘛。哈哈哈哈。
      

  6.   

    to一个什么类型的Array啊?在java泛型出来之前,这种做法恐怕是比较好的做法了。
    假如以绝大多数都传入0长度代码做为推出后面结论的依据,恐怕也说不过去,因为依据本身就不是分妥当,是吧?!
      

  7.   

    因为方法的需要,方法就是这么定义的
    T[] toArray(T[] a) 参数传入一个数组,输出和参数同类型的数组,该参数相当于告诉方法要转为什么类型,所以一般传入个0长度的数组就可以了,即代码中的new String[]{}或new String[0]
    或许方法定义为toArray(Class<T>)会好理解一些,可能是考虑兼容的问题吧
    之前的版本应该是Object[] toArray(Object[] a)
      

  8.   

    如果是为了向后兼容,java为何不选择用如下的方式呢:
    String str[] = allList.toArray(String.class);只是为了知道数组元素类型嘛,直接给它个class也比传个空数组优雅。。
      

  9.   

    lz可以看看源码就知道怎么回事了。
        public <T> T[] toArray(T[] a) {
            if (a.length < size)
                a = (T[])java.lang.reflect.Array.
    newInstance(a.getClass().getComponentType(), size);
        System.arraycopy(elementData, 0, a, 0, size);
                if (a.length > size)
                  a[size] = null;
                return a;
        }
      

  10.   

    这种方式怎么搞?方法定义返回结果怎么定义?还得是Object[],还得强制转换!那直接toArray()方法不就解决掉了?多加这个不是画蛇添足!只有泛型才能使得返回结果不用强制转换
      

  11.   

    这种方式怎么搞?方法定义返回结果怎么定义?还得是Object[],还得强制转换!那直接toArray()方法不就解决掉了?多加这个不是画蛇添足!只有泛型才能使得返回结果不用强制转换
      

  12.   

    List中的对象是Object的,按道理将转换的时候每一项都要强制类型转化,加上后面的类型相当于这个功能吧,可以这样理解。
      

  13.   

    <T> T[] toArray(T[] a)  
               Returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned array is that of the specified array.通过参数类型来确定返回值类型。-------String str[] = allList.toArray(new String[]{}) ; // 指定好类型
    -------将allList中的元素按集合中的顺序以String[]形式返回。
      

  14.   

    当初如果想这样做也不是不可以,比如
        public <T> T[] toArray(Class<T> clazz) {
            //if (a.length < size)
            T[] a = (T[])java.lang.reflect.Array.newInstance(clazz, size);
            System.arraycopy(elementData, 0, a, 0, size);
            return a;
        }