91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中常量折疊的示例分析

發布時間:2021-08-19 14:15:05 來源:億速云 閱讀:133 作者:小新 欄目:編程語言

小編給大家分享一下java中常量折疊的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

實例解析

讓我迷惑的代碼是下面這段代碼

 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));
 }

這段的執行結果是

true
false

我就是不明白為什么第一個返回true呢?

留著這個疑問,我們先了解下常量折疊的概念。來更好的理解上面的代碼

常量折疊

常量折疊的概念

  • 常量折疊是一種編譯器優化技術。

  • 常量折疊主要指的是編譯期常量加減乘除的運算過程會被折疊

對于 String s1 = "1" + "2";

編譯器會給你優化成 String s1 = "12";

在生成的字節碼中,根本看不到 "1" "2" 這兩個東西。

我們通過idea進行驗證下

1、源碼文件

 public static void main(String[] args) {
 String s1 = "1"+"2";
 }

2、運行后,idea有個out文件夾,找到上面文件的class文件

 public static void main(String[] args) {
 String s1 = "12";
 }

確實如上面所說,編譯器會給你進行優化

常量折疊發生的條件

必須是編譯期常量之間進行運算才會進行常量折疊。

編譯期常量就是“編譯的時候就可以確定其值的常量”,

  • 首先:字面量是編譯期常量。(數字字面量,字符串字面量等)

  • 其次:編譯期常量進行簡單運算的結果也是編譯期常量,如1+2,"a"+"b"。

  • 最后:被編譯器常量賦值的 final 的基本類型和字符串變量也是編譯期常量。

舉個栗子

1.第一個栗子

 public static void main(String[] args) {
 String s1="a"+"bc";
 String s2="ab"+"c";
 System.out.println(s1 == s2);
 }

相信大家都知道了,輸出為true

并且只創建了一個 "abc" 字符串對象,且位于字符串常量池中。

2、第二個栗子

 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);
 }

這個結果呢?false

s1 是字符串字面量相加,但是 s2 卻是兩個非 final 的變量相加,所以不會進行常量折疊。

而是根據 String 類特有的 + 運算符重載,變成類似這樣的代碼

String s2 = new StringBuffer(a).append(b).toString();

這里toString()會生成新的String變量,顯然用 == 運算符比較是會返回 false。

3、第三個栗子

 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);
 }

這里的結果就是true

因為 被編譯器常量賦值的 final 的基本類型和字符串變量也是編譯期常量

4、第四個栗子

 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);
 }

這里的結果是false

這里需要注意的是:final的變量,不是被編譯期常量初始化的也不是編譯器常量

這里的a 就不是編譯器常量

以上是“java中常量折疊的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涟水县| 西藏| 来安县| 昌吉市| 昌宁县| 商水县| 兴海县| 慈利县| 平舆县| 延吉市| 永昌县| 凌海市| 扬中市| 哈密市| 平舆县| 闽侯县| 鸡东县| 贡山| 榕江县| 中江县| 东安县| 淮北市| 法库县| 景东| 塔河县| 读书| 安徽省| 东乡| 阿巴嘎旗| 沙雅县| 九江县| 石屏县| 古交市| 巩义市| 德江县| 馆陶县| 菏泽市| 旌德县| 驻马店市| 开平市| 卢湾区|