转载:http://llade.iteye.com/blog/199818

Collection在很多情况下需要转换为数组来处理(很多接口方法都使用array作为参数)。 
Collection的toArray()方法返回的Object[],是不能被强制转换为子元素类型的 
例如:

  1. List l=new ArrayList();
  2. l.add("a");
  3. l.add("b");
  4. String[] strs=(String[])l.toArray();//throw ClassCastException

通常的做法是:

  1. String[] strs=new String[l.size()];
  2. l.toArray(strs);

toArray(T[] a)方法有个比较怪异的地方:

  1. List l=new ArrayList();
  2. l.add("a");
  3. l.add("b");
  4. String[] strs=new String[4];//比List多2个元素
  5. for(int i=0;i<strs.length;i++){//填充4个字符串"x”
  6. strs[i]="x";
  7. }
  8. String[] newStrs=(String[]) l.toArray(strs);
  9. System.out.println(newStrs==strs);//为了确定是否传入的参数对象和返回的是同一个对象。
  10. for(int i=0;i<strs.length;i++){
  11. System.out.println(strs[i]);
  12. }

得到的结果是:

  • true
  • a
  • b
  • null
  • x

JAVA API文档的说明:

引用
toArray 
<T> T[] toArray(T[] a)返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。如果指定的数组能容纳该 collection,则返回包含此 collection 元素的数组。否则,将根据指定数组的运行时类型和此 collection 的大小分配一个新数组。 
如果指定的数组能容纳 collection 并有剩余空间(即数组的元素比 collection 的元素多),那么会将数组中紧跟在 collection 末尾的元素设置为 null。(这对确定 collection 的长度很有用,但只有 在调用方知道此 collection 没有包含任何 null 元素时才可行。) 

如果此 collection 对其迭代器返回的元素顺序做出了某些保证,那么此方法必须以相同的顺序返回这些元素。

像 toArray 方法一样,此方法充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。更进一步说,此方法允许在输出数组的运行时类型上进行精确控制,并且在某些情况下,可以用来节省分配开销。 

假定 l 是只包含字符串的一个已知 List。以下代码用来将该列表转储到一个新分配的 String 数组: 

     String[] x = (String[]) v.toArray(new String[0]); 
注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。 

参数: 
a - 存储此 collection 元素的数组(如果其足够大);否则,将为此分配一个具有相同运行时类型的新数组。 
返回: 
包含此 collection 元素的数组 
抛出: 
ArrayStoreException - 指定数组的运行时类型不是此 collection 每个元素运行时类型的超类型。 
NullPointerException - 如果指定的数组为 null。

Collection的toArray()使用上需要注意的地方的更多相关文章

  1. PHP 文件上传注意一个地方,移动文件时要保证目标目录存在,否则报错

    move_uploaded_file ( $_FILES ["file"] ["tmp_name"], "upload/" . $fileN ...

  2. 关于tp5.0中对象数组转换普通数组使用助手函数collection而不是toArray

    tp5.0新版的模型查询返回默认对象,系统默认增加了toArray方法,许多开发者在all或select尝试使用toArray来转换为数组,在此希望开发者能理解对象的概念,尝试使用对象进行数据的使用, ...

  3. Backbone源码解析(三):Collection模块

    Collection模块式是对分散在项目中model的收集,他可以存储所有的model,构成一个集合,并且通过自身的方法统一操作model.Collection模块包装着若干对象,对象本身不具有一些方 ...

  4. 集合框架之Collection接口

    Collection 层次结构中的根接口.Collection表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 coll ...

  5. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

  6. 在MongoDB数据库中查询数据(上)

    在MongoDB数据库中查询数据(上) 在MongoDB数据库中,可以使用Collection对象的find方法从一个集合中查询多个数据文档,find方法使用方法如下所示: collection.fi ...

  7. Java容器---Collection接口中的共有方法

    1.Collection 接口 (1)Collection的超级接口是Iterable (2)Collection常用的子对象有:Map.List.Set.Queue. 右图中实现黑框的ArrayLi ...

  8. 为什么 Java ArrayList.toArray(T[]) 方法的参数类型是 T 而不是 E ?

    前两天给同事做 code review,感觉自己对 Java 的 Generics 掌握得不够好,便拿出 <Effective Java>1 这本书再看看相关的章节.在 Item 24:E ...

  9. AJPFX关于Collection接口的总结

    ###15Collection-List-ArrayList/LinkedList/*  * Collection接口中的方法* A:添加功能*                 boolean add ...

随机推荐

  1. keil 编译的一些错误

    以前使用的是MDK4.5 但是没有stm32F3的元器件,果断的使用了4.6版本了.但是编译之后出现这样错误:linking....\Obj\prj.axf: Warning: L6373W: lib ...

  2. codeforces 520 Two Buttons

    http://codeforces.com/problemset/problem/520/B B. Two Buttons time limit per test 2 seconds memory l ...

  3. 批量文本读取URL获取正常访问且保留对应IP

    #coding=utf-8 import sys import requests for i in range(3000,4999,1): url = 'http://192.168.88.139:8 ...

  4. Android so lib库远程http下载和动态注册

    一.背景 在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过 ...

  5. 实现listview的条目点击后改变背景颜色

    gv_categoryeffect_gridview.setChoiceMode(GridView.CHOICE_MODE_SINGLE);,再设置一个selector的背景选择器 getResour ...

  6. Java Switch(String)

    package shb.java.test; /** * switch支持字符串 * @Package:shb.java.test * @Description: * @author shaobn * ...

  7. 夺命雷公狗---DEDECMS----12dedecms全局标签的使用以及嵌套标签的使用

    在网站开发中,在很多页面可能会使用到同一个变量,比如路径网站信息等,所以我们可以用全局变量来使用. 默认的放在: 进去里面看下就会发现很多的常量都是在这里定义的: 我们在实际开发的时候可以将我们在多个 ...

  8. Server2003系统上的内置服务器设置某类IP无法访问问题

    最近测试过程中遇到了一个很奇怪的现象,把服务器(测试产品)部署在Server2003系统的外网A上,把客户端(测试产品)部署在内网B,网络A,B用路由器相连,设置网络A为200.1.1.255,发现客 ...

  9. sqlhelper-sql数据库

    using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; usin ...

  10. 函数后面加throw关键字

    [1]为什么函数后面加throw关键字? C++函数后面加关键字throw(something)限制,是对这个函数的异常安全性作出限制. 举例及解释如下: void fun() throw() 表示f ...