资讯专栏INFORMATION COLUMN

Java源码中有意思的代码片段

Scorpion / 192人阅读

摘要:无聊时,看了一下源码,发现一个有趣的代码片段。下面是我的代码运行结果程序不没有报错,可以正常运行,运行的结果和我们使用标准的循环一样。

无聊时,看了一下java.util.Collections源码,发现一个有趣的代码片段。下面这段代码是从java.util.Collections中Copy出来的,大看一下有趣在哪里??

public static int indexOfSubList(List source, List target) {
    int sourceSize = source.size();
    int targetSize = target.size();
    int maxCandidate = sourceSize - targetSize;

    if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
        (source instanceof RandomAccess&&target instanceof RandomAccess)) {
    nextCand:
        for (int candidate = 0; candidate <= maxCandidate; candidate++) {
            for (int i=0, j=candidate; i si = source.listIterator();
    nextCand:
        for (int candidate = 0; candidate <= maxCandidate; candidate++) {
            ListIterator ti = target.listIterator();
            for (int i=0; i
上面有个语法这样的:
nextCand:
        for (int candidate = 0; candidate <= maxCandidate; candidate++) {
            ListIterator ti = target.listIterator();
            for (int i=0; i

这样的语法很少见,可以说几乎在Java根本没有,一开始我还以是反编译时编译出错了,出现了语法错误,但是我好奇的试了一下这个语法,真是奇了,竟然可以通过编译,程序也能正常运行。

下面是我的代码:
public class Test {
    
    public static void main(String[] args) {
        
        isNext : for (int i = 0; i < 5; i++) {
                if ((i % 2) != 0) {
                    continue isNext;
                }
                System.out.println("i ==> " + i);
            }
    }
}
运行结果:

程序不没有报错,可以正常运行,运行的结果和我们使用标准的 for 循环一样。从上面的运行结果可以看出 continue isNext 的作用和 continue 一样,都是跳出当前循环。

说道这里,我们分析一样一下这个语言的使用场景,先看一下语法。

identifies :  
    code segment {
        break/continue identifies;
    }

identifies 是自定义的,定义的规则个Java的参数定义一样,如果冒号后面跟的的循环,可以使用 break identifies 跳出整个循环,或 continue identifies 退出当前循环。其实最上面的源码中,就有注解: // Element mismatch, try next cand(元素不匹配,尝试下一个元素),当然,我还发现另一种用法,那就是,冒号后面跟着方法,也可以执行方法。

eg: for(;;;) {continue identifies}
public static void isNext1() {
    // for(;;;) {continue identifies}
    isNext1 : for (int i = 0; i < 5; i++) {
        if ((i % 2) != 0) {
            continue isNext1;
        }
        System.out.println("i ==> " + i);
    }
}

eg: do...while() {break identifies}
public static void isNext2() {
    // do...while() {break identifies}
    isNext2 : do {
        System.err.println("while() {break identifies}");
        if (true) {
            break isNext2;
        }
    } while (true);
}

eg: do...while() {break identifies}
public static void isNext3() {
    // while() {break identifies}    
    isNext3 : while (true) {
        System.err.println("do...while() {break identifies}");
        if (true) {
            break isNext3;
        }
    }
}

eg: switch() {break identifies}
public static void isNext4() {
    // switch() {break identifies}
    isNext4 : switch (1) {
        case 1:
            System.err.println("switch() {break identifies}");
            break isNext4;
        default:
            break isNext4;
    }
}

eg: method()
public static void isNext5() {
    isNext : test(11);
}

public static void test(int arg) {
    System.err.println("method() ==> " + arg);
}

总结

这种语法就是用来装逼的,没有什么软用。O(∩_∩)O哈哈哈~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66099.html

相关文章

  • java源码一带一路系列】之LinkedHashMap.afterNodeAccess()

    摘要:如今行至于此,当观赏一方。由于所返回的无执行意义。源码阅读总体门槛相对而言比,毕竟大多数底层都由实现了。比心可通过这篇文章理解创建一个实例过程图工作原理往期线路回顾源码一带一路系列之源码一带一路系列之源码一带一路系列之 本文以jdk1.8中LinkedHashMap.afterNodeAccess()方法为切入点,分析其中难理解、有价值的源码片段(类似源码查看是ctrl+鼠标左键的过程...

    levy9527 评论0 收藏0
  • Android交流会-碎片Fragment,闲聊单位与尺寸

    摘要:有四种状态运行状态,暂停状态,停止状态,销毁状态。静态动态动态加载步骤创建添加的实例获取,调用方法开启事务,调用方法调用方法提交。和之间的通信和之间的通信,的方法来获取相应碎片的实例。 女孩:又周末了哦~ 男孩:那么今日来开个交流会,我们也学一学人家高大尚的大会,自己开一个,广州站,Android开发攻城狮交流会~ 1.Fragment概要: Android从3.0开始引入了Fragme...

    zombieda 评论0 收藏0
  • 分享代码片段:如何对自动生成java代码做自动格式化,以达到接近手写效果

    摘要:原文链接如题,有的时候,我们会采用自动生成代码的方式来完成一些任务,比如根据业务数据自动生成调用的供用户下载使用这样自动生成的代码,如果未经格式化处理,基本上是不可读的正好,我们常用的,快捷键就能自动格式化代码那么,下面这段代码,就是将的这 原文链接:https://gist.github.com/pfmiles/653c8b59e795698c867d 如题,有的时候,我们会采用自...

    lykops 评论0 收藏0
  • Backbone源码解读(三)

    摘要:事件关于路由触发事件是通过两个函数来完成的,它们分别是和前者会检测路由是否发生了改变,如果改变了就会触发函数并调用函数,而后者会通过路由片段来找到相关的事件函数来触发。 注意:强烈建议一边阅读源码一边阅读本文。 终于到了backbone源码解读的最后一篇,这一篇和前面几篇时间上有一定的间隔(因为要回学校有一堆乱七八糟的事...)。在这一篇里面会讲解Bakcbone的sync & rou...

    feng409 评论0 收藏0
  • Java进阶1 —— 对象创建与销毁

    摘要:构造方法是在对象实例初始化过程中具有举足轻重的地位,并且提供了多种方式来定义构造方法。在中创建对象的开销是相当低的,并且速度很快。对象终结器前面我们讲述的都是构造方法和对象初始化相关的主题,但还未提及他们的反面对象销毁。 原文链接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...

    nemo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<