小編給大家分享一下java中常量折疊的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),襄城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:襄城等地區(qū)。襄城做網(wǎng)站價(jià)格咨詢:18980820575實(shí)例解析
讓我迷惑的代碼是下面這段代碼
public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c)); System.out.println((a == e)); }
這段的執(zhí)行結(jié)果是
true
false
我就是不明白為什么第一個(gè)返回true呢?
留著這個(gè)疑問,我們先了解下常量折疊的概念。來更好的理解上面的代碼
常量折疊
常量折疊的概念
常量折疊是一種編譯器優(yōu)化技術(shù)。
常量折疊主要指的是編譯期常量加減乘除的運(yùn)算過程會(huì)被折疊
對(duì)于 String s1 = "1" + "2";
編譯器會(huì)給你優(yōu)化成 String s1 = "12";
在生成的字節(jié)碼中,根本看不到 "1" "2" 這兩個(gè)東西。
我們通過idea進(jìn)行驗(yàn)證下
1、源碼文件
public static void main(String[] args) { String s1 = "1"+"2"; }
2、運(yùn)行后,idea有個(gè)out文件夾,找到上面文件的class文件
public static void main(String[] args) { String s1 = "12"; }
確實(shí)如上面所說,編譯器會(huì)給你進(jìn)行優(yōu)化
常量折疊發(fā)生的條件
必須是編譯期常量之間進(jìn)行運(yùn)算才會(huì)進(jìn)行常量折疊。
編譯期常量就是“編譯的時(shí)候就可以確定其值的常量”,
首先:字面量是編譯期常量。(數(shù)字字面量,字符串字面量等)
其次:編譯期常量進(jìn)行簡(jiǎn)單運(yùn)算的結(jié)果也是編譯期常量,如1+2,"a"+"b"。
最后:被編譯器常量賦值的 final 的基本類型和字符串變量也是編譯期常量。
舉個(gè)栗子
1.第一個(gè)栗子
public static void main(String[] args) { String s1="a"+"bc"; String s2="ab"+"c"; System.out.println(s1 == s2); }
相信大家都知道了,輸出為true
并且只創(chuàng)建了一個(gè) "abc" 字符串對(duì)象,且位于字符串常量池中。
2、第二個(gè)栗子
public static void main(String[] args) { String a = "a"; String bc = "bc"; String s1 = "a" + "bc"; String s2 = a + bc; System.out.println(s1 == s2); }
這個(gè)結(jié)果呢?false
s1 是字符串字面量相加,但是 s2 卻是兩個(gè)非 final 的變量相加,所以不會(huì)進(jìn)行常量折疊。
而是根據(jù) String 類特有的 + 運(yùn)算符重載,變成類似這樣的代碼
String s2 = new StringBuffer(a).append(b).toString();
這里toString()會(huì)生成新的String變量,顯然用 == 運(yùn)算符比較是會(huì)返回 false。
3、第三個(gè)栗子
public static void main(String[] args) { final String a = "a"; final String bc = "bc"; String s1 = "a" + "bc"; String s2 = a + bc; System.out.println(s1 == s2); }
這里的結(jié)果就是true
因?yàn)?被編譯器常量賦值的 final 的基本類型和字符串變量也是編譯期常量
4、第四個(gè)栗子
public static void main(String[] args) { String x ="a"; final String a = x; final String bc = "bc"; String s1 = "a" + "bc"; String s2 = a + bc; System.out.println(s1 == s2); }
這里的結(jié)果是false
這里需要注意的是:final的變量,不是被編譯期常量初始化的也不是編譯器常量
這里的a 就不是編譯器常量
以上是“java中常量折疊的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
標(biāo)題名稱:java中常量折疊的示例分析-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article2/jjcoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、企業(yè)建站、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)