强制类型转换 ArrayList使用toArray.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
强制类型转换 ArrayList使用toArray

强制类型转换 ArrayList使用toArray 本文链接:正文: 1.为了方便按列作外循环,想把ArrayList构造成一个二维数组,如下: . ArrayList result=GetResult(); int n=result.size(); String myArray=new String[n];//定义二维数组for(int i=0;i n;i++)//构造二维数组{ArrayList tempArray=(ArrayList)result.get(i);myArray[i]=(String)tempArray.toArray();} . 程序可以编译通过。 但在运行到myArray[i]=(String)tempArray.toArray()时,出现java.lang.ClassCastException的错误,很奇怪。 花了一晚上时间,查了N多资料,总算搞定了。现把问题记录下来,以备参考。 2.此事从头说起。 ArrayList类扩展AbstractList并执行List接口。ArrayList支持可随需要而增长的动态数组。 ArrayList有如下的构造函数:ArrayList()ArrayList(Collection c)ArrayList(int capacity) 如果调用new ArrayList()构造时,其默认的capacity(初始容量)为10。 参见ArrayList源码,其中是这样定义的: public ArrayList(){this(10);} 默认初始化内部数组大小为10。为什么是10?不知道。可能SUN觉得这样比较爽吧。 程序编译后执行ArrayList.toArray(),把ArrayList转化为数组时,该数组大小仍为capacity(为10)。 当装入的数据和capacity值不等时(小于capacity),比如只装入了5个数据,数组中后面的(capacity-size)个对象将置为null,此时当数组强制类型转换时,容易出现一些问题,如java.lang.ClassCastException异常等。 解决办法是:在用ArrayList转化为数组装数据后,使用trimToSize()重新设置数组的真实大小。 3.本例修改后的代码修如下,可顺利运行: for(int i=0;i n;i++)//构造二维数组{ArrayList tempArray=(ArrayList)result.get(i);myArray[i]=(String)tempArray.toArray(new String[0]);//注意此处的写法} 看看下面这些也许就明白了- ArrayList.toArray()之一: public Object toArray(){Object result=new Object[size];System.arraycopy(elementData,0,result,0,size);return result;} 返回ArrayList元素的一个数组,注意这里虽然生成了一个新的数组,但是数组元素和集合中的元素是共享的,Collection接口中说这个是安全的,这是不严格的。 下面的例子演示了这个效果。ArrayList al=new ArrayList();al.add(new StringBuffer(hello));Object a=al.toArray();StringBuffer sb=(StringBuffer)a[0];sb.append(changed);//改变数组元素同样也改变了原来的ArrayList中的元素System.out.println(al.get(0)); 这里不要用String来代替StringBuffer,因为String是不可变的。 ArrayList.toArray()之二: public Object toArray(Object a){if(a.length size)a=(Object)java.lang.reflect.Array.newInstance(a.getClass().getComponentType(),size);System.arraycopy(elementData,0,a,0,size);if(a.length size)a[size]=null;return a;} 这个方法有可能不需要生成新的数组,注意到如果数组a容量过大,只在size处设置为null。 如果这个数组a足够大,就会把数据全放进去,返回的数组也是指向这个数组,(数组多余的空间存储的是null对象);要是不够大,就申请一个跟参数同样类型的数组,把值放进去,然后返回。 4.网上的资料一: public String getPlatf

文档评论(0)

feixiang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档