最近一直忙于 coding 和进行项目管理,就没啥时间更新 blog,今天上午趁有时间摸鱼,就简单总结一下有关集合转数组与数组转集合的坑。
问题起因1
在写代码的时候使用 toArray 方法 的时候就一直很好奇传入的长度为什么是 0 而不是其他(因为我参照老员工的哈哈哈,cv 战士),后来 review 代码的时候重新捡起了这个疑惑,然后翻了翻源码。
源码:
@SuppressWarnings("unchecked")
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;
}
结论
个人理解应该是这样描述的 当传入的泛型数组大小小于集合大小时,使用集合大小,否则,使用数组大小。
然后翻看华山版里面也有说到这个问题,直接放图吧
问题起因 2
一开始在 coding 中把数组转集合的过程中,给我报了个错
java.lang.UnsupportedOperationException
网上有很多关于这个报错的解决方法,在这里我就参考华山版简单说一下原因吧:
asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。
网上我觉得比较合理的解释:
调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的市Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。
结论
使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
参照:
《Java 开发手册》—华山版
java.lang.UnsupportedOperationException解决方法