一、源码解读

@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

最新文章

  1. iOS UITableView 分割线从零开始
  2. BZOJ 3640 JC的小苹果(逆矩阵)
  3. Java的RandomAccessFile
  4. neovim的新体验
  5. UI自动化测试(二)浏览器操作及对元素的定位方法(xpath定位和css定位详解)
  6. uva11059(最大乘积)
  7. centos7内网源站建设
  8. /var/log各种日志
  9. MFC中创建自定义消息
  10. Nginx+Tomcat配置负载均衡-动静分离(二)
  11. ios开发版证书与企业证书相关文件申请安装及其使用方法
  12. 转:centos7/rhel7安装较高版本ruby2.2/2.3/2.4+
  13. Map 接口
  14. Identity Server4学习系列一
  15. GATT scan的流程
  16. Thinkphp分页类使用
  17. 关于 eclipse启动卡死的问题 解决方法
  18. js 随机变换图片
  19. RP2836 OUT0-OUT7 对应关系
  20. phpstorm下TODO注释

热门文章

  1. Java 集合排序策略接口 Comparator
  2. 手把手教你用Python网络爬虫获取网易云音乐歌曲
  3. 一个导致JVM物理内存消耗大的Bug
  4. IDEA启动springboot项目找不到application.yml配置文件
  5. PHP实现插入100万条数据优化
  6. SA-N26接口和EPS fallback
  7. nginx配置https及Android客户端访问自签名证书
  8. 通过一个vue+elementUI的小实例来讲解一下它们是如何使用的
  9. php实现ajax请求的方法
  10. 怎样实现登录?| Cookie or JWT