Java 源码中String奇怪的代码

引言

无聊,翻源代码,看到不能理解的东西了。

源代码

以下代码引自String中toLowerCase方法的一部分

/* Now check if there are any characters that need to be changed. */
        scan: {
            for (firstUpper = 0 ; firstUpper < len; ) {
                char c = value[firstUpper];
                if ((c >= Character.MIN_HIGH_SURROGATE)
                        && (c <= Character.MAX_HIGH_SURROGATE)) {
                    int supplChar = codePointAt(firstUpper);
                    if (supplChar != Character.toLowerCase(supplChar)) {
                        break scan;
                    }
                    firstUpper += Character.charCount(supplChar);
                } else {
                    if (c != Character.toLowerCase(c)) {
                        break scan;
                    }
                    firstUpper++;
                }
            }
            return this;
        }

理解

这个东西第一感觉就是C中的标签,通过todo进行跳转到某一个代码位置,但是Java不支持todo,所以就很迷,然后break中平时使用是 break不加任何后缀的,但是这里面break添加了“标签”,所以没那么简单。

实践&验证

System.out.println("#START");
        a:
        {
            for (int i = 0; i < 5; i++) {
                System.out.println("S-FLAG-" + i);
                for (int j = 0; j < 6; j++) {
                    System.out.println(j);
                    if (j == 5) {
                        break a;
                    }
                }
                System.out.println("E-FLAG" + i);
            }
            System.out.println("----");
        }
        System.out.println("#END");

此时输出的结果为:

#START
S-FLAG-0
0
1
2
3
4
5
#END

如果把break a;换成break; ,那么输出的是如下:

#START
S-FLAG-0
0
1
2
3
4
5
E-FLAG0
S-FLAG-1
0
1
2
3
4
5
E-FLAG1
S-FLAG-2
0
1
2
3
4
5
E-FLAG2
S-FLAG-3
0
1
2
3
4
5
E-FLAG3
S-FLAG-4
0
1
2
3
4
5
E-FLAG4
----
#END

结论

综上可以发现,这种用法可以跳出多层循环,类似于return方法跳出循环,但是这也可以理解成把自己定义成了一个方法,然后return了,方法中的方法,这也解释的通System.out.println("----");方法没有执行了。

求助

如果哪位大佬知道这个方法叫什么名字,以及相关的说明,欢迎评论。

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。