list.toArray()之后为什么第一个为null

ruoye_2008 2010-01-06 04:06:44

String[] t = {"a","b","c","d"};
List<String> list = new ArrayList<String>();
String[] tt = list.toArray(t);
for(String a : tt){
System.out.println(a);
}


如上,刚看到一个问题,为什么第一个值为null
...全文
352 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruoye_2008 2010-01-06
  • 打赏
  • 举报
回复
开始看6楼的代码,由于看错了个东西,搞晕了头,后来终于搞清楚了。

提醒一句,符号“}”最好占一行!
zhaining522 2010-01-06
  • 打赏
  • 举报
回复

String[] a = {"a","b","c","d"};
List<String> list = new ArrayList<String>();
Object[]elementData =list.toArray();
int size = list.size();
System.out.println("size = " + size);
if (a.length < size){
System.out.println("111111111111111");
a = (String[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);}
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size){
System.out.println("2222222222222");
a[size] = null;}

System.out.println(a[0]);
for(String aa : a){
System.out.println(aa);
}



这个是把jdk源码中的代码放到自己程序里面的程序
当size=0的时候 toArray方法就把传入的数组中的[0]位设置成null了
并把传入的这个数组返回。
所以数组的第一个元素为null其他元素不变

但是jdk为什么这么设计呢?。。。。谁解答一下

applerockhool 2010-01-06
  • 打赏
  • 举报
回复
速度好快
ltandfyy 2010-01-06
  • 打赏
  • 举报
回复
我晕,LS两位手够快的,我在打字中,你们已经完成了!
ltandfyy 2010-01-06
  • 打赏
  • 举报
回复
看下api的解释就会明白了,该方法的做用为:
返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。
如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。

LZ代码中的list的元素个数为0,指定的t数组是能容下的,所以会出现这种情况,如果list中有元素,并且比t数组元素个数多,那返回的就是list中元素了,如果list中有元素,但比t数组元素个数少,比如list中有个“1”,返回值为: "1",null,"b","c"
具体LZ可以试一下!
阿_布 2010-01-06
  • 打赏
  • 举报
回复
jdk源码:
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;
}
cpu2001 2010-01-06
  • 打赏
  • 举报
回复
toArray

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

返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。

如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。

指定者:
接口 Collection<E> 中的 toArray
指定者:
接口 List<E> 中的 toArray
覆盖:
类 AbstractCollection<E> 中的 toArray

参数:
a - 要存储列表元素的数组,如果它足够大的话;否则,它是一个为存储列表元素而分配的、具有相同运行时类型的新数组。
返回:
包含列表元素的数组。
抛出:
ArrayStoreException - 如果 a 的运行时类型不是此列表中每个元素的运行时类型的超类型。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧