标签:index findIndex java current list len break
在学习CopyonWriteArrayList的源码中,发现了这么一段代码:
private boolean remove(Object o, Object[] snapshot, int index) {
//加锁
final ReentrantLock lock = this.lock;
lock.lock();
try {
//获取数组
Object[] current = getArray();
int len = current.length;
//判断传进来的数组是否和现数组相等
if (snapshot != current) findIndex: {
//获取索引和现有长度的最小值
int prefix = Math.min(index, len);
for (int i = 0; i < prefix; i++) {
if (current[i] != snapshot[i] && eq(o, current[i])) {
index = i;
break findIndex;
}
}
if (index >= len)
return false;
if (current[index] == o)
break findIndex;
index = indexOf(o, current, index, len);
if (index < 0)
return false;
}
Object[] newElements = new Object[len - 1];
System.arraycopy(current, 0, newElements, 0, index);
System.arraycopy(current, index + 1,
newElements, index,
len - index - 1);
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
这其中用到了findIndex: 这样一个结构,第一次遇到这样的结构体,询问同事,同事说可能是c语言中的goto语句,仔细观看源码后,就发现,如果是goto语句,那么只要snapshot 数组和 current数组 不相等,那么这就是一个死循环,一直回到if判断哪里。于是我又去看其它分析CopyonWriteArrayList 的文章,发现这个findIndex: 这是指类似方法体的东西,将括号后面的内容当做一个整体,只要出现break findIndex 就跳出整个方法体,执行方法体之后的代码。
实例代码如下:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
findIndex:{
for (String s : list) {
if(s.equals("2")){
break findIndex;
}
}
System.out.println(2);
}
System.out.println(1);
}
但执行这段代码,会发现,break findIndex 跳出的不是for循环,而是跳出findIndex 方法体,
如果把break 这里的 findIndex 去除,那么这里还是会打印2出来。
标签:index,findIndex,java,current,list,len,break 来源: https://blog.csdn.net/weixin_44048746/article/details/121016001
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。