A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴通 中级黑马   /  2012-8-31 20:13  /  2712 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class CollectionToArray
{
public static void main(String[] args)
{
  ArrayList<String> al=new ArrayList<String>();
  al.add("abc1");
  al.add("abc2");
  al.add("abc3");
  String[] arr=al.toArray(new String[0]);  //这里面写的是数组的长度,当为0的时候为什么还能存?不写为什么不行?
  /*
  1.指定类型的数组到底多长才行呢?
  当指定类型的数组长度小于集合的size,那么该方法内部会创建一个新的数组,长度为集合的size
  当指定类型的数组长度大于集合的size,就不会新创建新数组了,而是使用传递进来的数组。
  所以创建一个刚刚好的数组最优    那么这里写0和al.size是不是都一样?
  */
  sop(Arrays.toString(arr));
}
public static void sop(Object obj)
{
  System.out.println(obj);
}
}

5 个回复

倒序浏览
<T> T[] toArray(T[] a)需要一个T[] a,new String[0]相当于开辟了一个长度为0的String[],并且指定了泛型。这样函数的调用是将al转换了一个String的数组。
String[] arr = al.toArray(new String[al.size()])
两种效果是一样的
回复 使用道具 举报
当指定类型的数组长度小于集合的size,那么该方法内部会创建一个新的数组,长度为集合的size
这边不是说,会创建一个新的数组吗,那你传进去的数组不是没用上,这样不是要浪费内存了吗?
回复 使用道具 举报
首先,toArray(T[] a)方法的参数是一个数组,你给它传入什么类型的数组,它返回的就是什么类型的数组,
数组的长度是固定的,既然是新建数组,数组的容量大小在创建时必须指定,所以[]中必须有数字,但不一定是0;
toArray(T[] a)的方法体如下:
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;
    }

和楼主知道的一样:
当指定类型的数组长度小于集合的size,那么该方法内部会创建一个新的数组,长度为集合的size,并且把数据拷贝一遍;
当指定类型的数组长度大于集合的size,就不会新创建新数组了,而是使用传递进来的数组,只不过是将数组中紧跟在集合末尾的元素设置为 null;
综上就可以看出,
当做参数传入进去的 新建数组,长度小于集合的size效率是低的,
长度是刚刚好 ,还是大于集合的size,没多大区别,取决于它返给你的数组,你是否还要对其进行操作
如果你还要对返回的数组进行添加,那新建数组长度还是要大于集合size好,你觉得呢
回复 使用道具 举报
格式:
  for(元素类型type 元素变量x : 遍历对象obj)
  {
  引用了x的java语句;
  }
  实例:
  public class Test {
  public static void main(String[] args)
  {
  int[] a = {1,2,3};
  for(int i : a)
  System.out.print(i + " ");
  }
  }
回复 使用道具 举报
首先要知道泛型怎么用,然后才能看懂这个方法public <T> T[] toArray(T[] a).要是对泛型不是很了解,可以使用public Object[] toArray()这个方法,返回Object数组,里面不用传递任何参数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马