提问:关于abstractConllection中finishToArray 的问题

nijihong1234 2017-03-13 11:04:21
abstractConllection中finishToArray 的实现有些问题;

private static <T> T[] finishToArray(T[] r, Iterator<?> it) {
int i = r.length;-----------------这里是获取数组r的大小
while (it.hasNext()) {
int cap = r.length; ------------------------这里为什么还要在获取一遍
if (i == cap) { ------------------------------什么情况下他们不相等
int newCap = cap + (cap >> 1) + 1;
// overflow-conscious code
if (newCap - MAX_ARRAY_SIZE > 0)
newCap = hugeCapacity(cap + 1);
r = Arrays.copyOf(r, newCap);
}
r[i++] = (T)it.next();
}
// trim if overallocated
return (i == r.length) ? r : Arrays.copyOf(r, i); ------------这里 i和r.length 什么时候会相等
}
...全文
216 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT布道 2017-05-19
  • 打赏
  • 举报
回复
这种情况是当出现多线程同时处理一个集合时,会发生的情况 当第一次执行while时,i==cap 第一次while执行完,i就+1了,看代码: r[i++] = (T)it.next();所以第二次执行while循环时,i != cap 有了上面的分析,那最后return的判断就明了了,当第一次执行while (it.hasNext())时,it.hasNext==false,则i == r.length

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧