黑马程序员技术交流社区

标题: 集合转化数组过程中的一个疑问 [打印本页]

作者: 乔九    时间: 2013-2-23 23:13
标题: 集合转化数组过程中的一个疑问
package com.itheima;
import java.util.*;
public class Toarray {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                ArrayList<String>al=new ArrayList<String>();
                al.add("njsajdfsjkl");
                al.add("hjskdnf");
                String[]s=al.toArray(new String[0]);此处中括号中的0代表什么意思是在初始化字符数组的长度吗
                System.out.println(al);

        }

}
作者: 王钊    时间: 2013-2-24 00:36
首先,从api文档可知,ArrayList有两个toArray方法,
一个不带参数toArray(),一个带参数<T> T[]  toArray(T[] a)
这道题显然调用的是带参数的那个,
问题就是为什么可以传入一个new String[0]
文档说明是这样的:按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果指定的数组能容纳列表,则将该列表返回此处。否则,将分配一个具有指定数组的运行时类型和此列表大小的新数组。  
如果指定的数组能容纳队列,并有剩余的空间(即数组的元素比队列多),那么会将数组中紧接 collection 尾部的元素设置为 null。(仅 在调用者知道列表中不包含任何 null 元素时才能用此方法确定列表长度)。
由此可见,这个参数可以做两件事
1,确定返回的数组类型要和这个参数数组类型一致。
2,如果传进去的数组能容下集合,就返回这个参数数组,多出来的部分用null填补上,否则,返回一个和传入数组类型相同的新数组,新数组正好装下集合的所有元素。
我的测试代码:
  1. public static void main(String[] args)
  2. {
  3. // TODO Auto-generated method stub
  4. ArrayList<String> al = new ArrayList<String>();
  5. al.add("njsajdfsjkl");
  6. al.add("hjskdnf");

  7. String[] s1 = al.toArray(new String[1]);
  8. System.out.println(s1.length);//结果为2
  9. for (String str : s1)
  10. {
  11. System.out.println(str);
  12. }
  13. System.out.println("-------------------------");
  14. String[] s2 = al.toArray(new String[5]);
  15. System.out.println(s2.length);//结果为5
  16. for (String str : s2)
  17. {
  18. System.out.println(str);
  19. }
  20. }
复制代码
集合中有2个元素,传入new String[1]放不下集合元素,返回正好等于集合长度的新数组,
传入new String[5],就返回这个长度为5数组,数组后3个元素用null补足。

作者: 王钊    时间: 2013-2-24 17:03
没有其他人回答吗
作者: 胥文    时间: 2013-2-24 17:22
你说的已经很好了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2