摘要:無聊時,看了一下源碼,發現一個有趣的代碼片段。下面是我的代碼運行結果程序不沒有報錯,可以正常運行,運行的結果和我們使用標準的循環一樣。
無聊時,看了一下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; isi = 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哈哈哈~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66099.html
摘要:如今行至于此,當觀賞一方。由于所返回的無執行意義。源碼閱讀總體門檻相對而言比,畢竟大多數底層都由實現了。比心可通過這篇文章理解創建一個實例過程圖工作原理往期線路回顧源碼一帶一路系列之源碼一帶一路系列之源碼一帶一路系列之 本文以jdk1.8中LinkedHashMap.afterNodeAccess()方法為切入點,分析其中難理解、有價值的源碼片段(類似源碼查看是ctrl+鼠標左鍵的過程...
摘要:原文鏈接如題,有的時候,我們會采用自動生成代碼的方式來完成一些任務,比如根據業務數據自動生成調用的供用戶下載使用這樣自動生成的代碼,如果未經格式化處理,基本上是不可讀的正好,我們常用的,快捷鍵就能自動格式化代碼那么,下面這段代碼,就是將的這 原文鏈接:https://gist.github.com/pfmiles/653c8b59e795698c867d 如題,有的時候,我們會采用自...
摘要:構造方法是在對象實例初始化過程中具有舉足輕重的地位,并且提供了多種方式來定義構造方法。在中創建對象的開銷是相當低的,并且速度很快。對象終結器前面我們講述的都是構造方法和對象初始化相關的主題,但還未提及他們的反面對象銷毀。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...
摘要:事件關于路由觸發事件是通過兩個函數來完成的,它們分別是和前者會檢測路由是否發生了改變,如果改變了就會觸發函數并調用函數,而后者會通過路由片段來找到相關的事件函數來觸發。 注意:強烈建議一邊閱讀源碼一邊閱讀本文。 終于到了backbone源碼解讀的最后一篇,這一篇和前面幾篇時間上有一定的間隔(因為要回學校有一堆亂七八糟的事...)。在這一篇里面會講解Bakcbone的sync & rou...
閱讀 1517·2021-11-18 10:02
閱讀 1657·2021-09-04 16:40
閱讀 3171·2021-09-01 10:48
閱讀 874·2019-08-30 15:55
閱讀 1853·2019-08-30 15:55
閱讀 1365·2019-08-30 13:05
閱讀 3013·2019-08-30 12:52
閱讀 1624·2019-08-30 11:24