【问题标题】:Why is arr[6] returning a null value in this code?为什么 arr[6] 在此代码中返回空值?
【发布时间】:2020-07-30 07:31:47
【问题描述】:
ArrayList<String> list1=new ArrayList<String>(),list2 = new ArrayList<String>(),list3= new ArrayList<String>();
list1.add("Hey");
list1.add("there");
list1.add(0, "knock");
list1.add(0, "knock");
list2.addAll(list1);
list3.add("Vasvi");
list3.add(0, "I'm");
list2.addAll(2, list3);
        
String[] arr= new String[8];
        
        
arr[6]="Who're";
arr[7]="You?";
System.out.println("arr[6]="+arr[6]);
        
arr=list2.toArray(arr);
System.out.println("arr[6]="+arr[6]);
        
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

输出:

arr[6]=是谁
arr[6]=null
敲 敲门
我是
瓦斯维

那里

你呢?

只要调用 toArray(arr) 方法,arr[6] 就会变为 null。我不明白为什么?

【问题讨论】:

  • 你看过toArray的实现了吗?
  • 根据我对 toArray() 的理解,这不应该发生。
  • 在调用toArray之前计算list2中元素的数量

标签: java arraylist data-structures


【解决方案1】:

因为toArray(T[] a)implementation有语句

if (a.length > size)
    a[size] = null;

这里就是这种情况,因为size 是 6,a.length 是 8,因此 a[6] = null 这正是您观察到的。

文档解释:

如果列表适合指定的数组并有剩余空间(即数组的元素比列表多),则数组中紧跟集合末尾的元素设置为null。 (这对于确定列表的长度只有很有用,如果调用者知道列表不包含任何空元素。)

【讨论】:

  • 如果是真的,为什么 arr[7] 不返回 null?
  • @VasviSood 因为文档和代码都没有这样说,所以这里没有什么要“如果那是真的”,结果是明确定义和编码的。
  • @VasviSood 你可以争辩说你希望它表现得不同,或者你希望它表现得不同,或者你会做不同的事情,但这并不重要,因为这不是你的决定。 “数组中紧跟集合末尾的元素设置为 null” 这就是正在发生的事情,故事结束,仅此而已。
【解决方案2】:

无需查看实现;看看the documentation 就足够了:

如果列表适合指定的数组并有剩余空间(即,数组的元素多于列表),则数组中紧跟集合末尾的元素设置为 null。

【讨论】:

  • 如果是真的,为什么 arr[7] 不返回 null?
  • @VasviSood 因为arr[7] 不是“数组中紧随集合结尾的元素”,因此文档中没有任何内容表明它也将设置为null
【解决方案3】:

了解toArray(T[] a) 工作原理的最佳方式是花点时间阅读javadocs

如果列表适合指定的数组并有剩余空间(即数组的元素比列表多),数组中紧跟列表末尾的元素设置为空。 (仅当调用者知道列表不包含任何空元素时,这对确定列表的长度很有用。)

在您的示例数组中有 8 个元素并且仅列出 6 个。因为第 6 个元素是 null

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多