使用增强型for循环和传统for循环从toarray()方法返回的打印数组之间的差异

时间:2014-11-17 00:15:08

标签: java for-loop toarray

我有这段代码,

class Test
{
    public static void main(String args[])
    {
        ArrayList<Integer> al=new ArrayList<>();
        al.add(1);
        al.add(2);
        al.add(3);
        Integer a[]=new Integer[2];
        al.toArray(a);
        for(int i:a)
        System.out.println(i);
        /*for(int i=0;i<a.length;i++)
        System.out.println(a[i]);*/

    }
}

上面的代码抛出NullPointerException但是如果我尝试关闭注释部分,并且注释增强了for循环,它将打印null 2次。打印a.length打印2.将整数数组大小设置为3将打印123。

如果我错了,现在纠正我:

1&GT;我对toArray(T [] a)方法的理解是,如果数组的大小小于列表中的元素,则将使用数组指定的大小创建新数组,并且考虑到这一点,其中的元素将为null。我的数组看起来像这样一个[] = {null,null};

2 - ;增强for循环和传统for循环之间的区别在于,您无法修改或删除增强for循环中的单个元素。

但是,为什么这个程序有所不同?我只是打印它们,为什么增强循环不打印null并抛出NullPointerException?

2 个答案:

答案 0 :(得分:1)

toArray(a)方法返回已转换的数组以及您应该使用的内容;它没有使用你的阵列,因为它不够大。

即,

  1. 如果您的列表大小为2(与您的数组长度相同) 提供了方法)或
  2. 如果您的数组长度为3(相同 作为要转换为数组的列表的大小,
  3. 你不需要返回的数组;因此,您的for循环会打印出您想要的内容。

    至于NullPointerException,因为它从Integerint进行了自动装箱。也就是说,以下代码不会抛出NPE

    for(Integer i : a)
    {
      System.out.println(i);
    }
    

    虽然下面的代码会(就像你的情况一样):

    for(int i : a)
    {
      System.out.println(i);
    }
    

    至于为什么编译器使用上面增强的for循环进行拆箱,考虑一下 - 数组的内容是boxed整数。您尝试将它们分配给primitive int引用(对于数组中的每个int,将其读作),因此唯一的方法是将盒装对象取消装箱。

    for(int i : a)
    {
      System.out.println(a[i]);
    }
    

    转换为

    for(int i = 0; i < a.length; i++)
    {
      System.out.println((int) a[i]);  // a[i] is null here, so casting causing an NPE
    }
    

    甚至更正确,

    for(int i = 0; i < a.length; i++)
    {
      System.out.println(a[i].intValue()); // a[i] is null here, causing an NPE
    }
    

答案 1 :(得分:0)

public <T> T[] toArray(T[] a)

它将数组作为参数来复制所有元素并返回该数组。如果你的数组足够大,那么就复制它,否则在运行时为此目的分配相同的新数组。在您的情况下,a的大小为2.因此创建了大小为3的新数组a,并将值复制到此新数组并返回。

第二件事是你打印[i]而不是i。因为我包含元素值所以打印i。

类似的东西:

public static void main(String args[])
{
    ArrayList<Integer> al=new ArrayList<>();
    al.add(1);
    al.add(2);
    al.add(3);
    Integer a[]=new Integer[2];
    a=al.toArray(a);
    for(Integer i:a) //or for(int i:a)
    System.out.println(i);
}