- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 十八护理核心制度.doc VIP
- Unit3OurcultureourtresaureReading课件高中英语牛津译林版(2020)选修第三册3.pptx
- JJF(京)159-2025 水质在线电导率仪校准规范.pdf VIP
- GZ104 跨境电子商务赛题第5套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 新22J10 无障碍设计.docx VIP
- 杨志人物介绍水浒传.pptx VIP
- 材料科学与工程基础》顾宜第四章课后答案.pptx VIP
- GZ104 跨境电子商务赛题第6套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 《PDCA管理循环培训》课件.ppt VIP
- DGTJ08-2206-2024 建筑信息模型技术应用标准(人防工程).pdf VIP
文档评论(0)