AbstractCollection类中的 T[] toArray(T[] a)方法源码解读
2024-08-29 22:29:35
一、源码解读
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
//size为集合的大小
int size = size();
//当传入数组大于集合大小时,r数组就是a数组,否则创建新的数组r,数组大小为集合大小
T[] r = a.length >= size ? a :
(T[])java.lang.reflect.Array
.newInstance(a.getClass().getComponentType(), size);
Iterator<E> it = iterator();
for (int i = 0; i < r.length; i++) {
//如果迭代器已经到底,但是数组还没占满,则说明集合数据减少了
if (! it.hasNext()) {
//若a和r相等,则把数组当前位置置空
if (a == r) {
r[i] = null;
//说明数组r为新的数组,此时数组的长度介于a和r之间,将r数组拷贝进新数组,长度设为i,即真实长度
} else if (a.length < i) {
return Arrays.copyOf(r, i);
//a的长度大于i的时候,把r数组赋值给a数组,若没填满,则剩余长度赋值为null
} else {
System.arraycopy(r, 0, a, 0, i);
if (a.length > i) {
a[i] = null;
}
}
//此时迭代器已经到底,且a数组够大,因此返回a数组
return a;
}
//迭代器没有到底,将集合元素放入r数组。
r[i] = (T)it.next();
}
//集合数据增加了,则需要扩容
return it.hasNext() ? finishToArray(r, it) : r;
}
二、直观的解释(区间判断)
当集合元素在获取迭代器后数量不变
则直接将数据赋值给r数组,并返回r数组
当集合元素在获取迭代器后数量增加
则将r数组填满后,剩余的集合元素使用finishToArray()方法填入新的数组中
当集合元素在获取迭代器后减少了
传入的数组a足够大,则r=a
当i<r时
将r中剩余元素设置为null,并返回r数组
传入的数组a不够大,装不下,则r>a
若a<i<r
r数组太大,需要缩短长度,将实际的元素填充r数组,r数组长度为实际集合长度
若i=<a<r
把r数组值复制给a数组中,此时a数组还没有填满,剩余的位置填充null
最新文章
- iOS UITableView 分割线从零开始
- BZOJ 3640 JC的小苹果(逆矩阵)
- Java的RandomAccessFile
- neovim的新体验
- UI自动化测试(二)浏览器操作及对元素的定位方法(xpath定位和css定位详解)
- uva11059(最大乘积)
- centos7内网源站建设
- /var/log各种日志
- MFC中创建自定义消息
- Nginx+Tomcat配置负载均衡-动静分离(二)
- ios开发版证书与企业证书相关文件申请安装及其使用方法
- 转:centos7/rhel7安装较高版本ruby2.2/2.3/2.4+
- Map 接口
- Identity Server4学习系列一
- GATT scan的流程
- Thinkphp分页类使用
- 关于 eclipse启动卡死的问题 解决方法
- js 随机变换图片
- RP2836 OUT0-OUT7 对应关系
- phpstorm下TODO注释