程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java編譯器中對string對象的優化

Java編譯器中對string對象的優化

編輯:關於JAVA

 首先把問題擺出來,先看這個代碼:

String a = "ab"; String b = "a" + "b";System.out.println((ab));

打印結果會是什麼?類似這樣的問題,有人考過我,我也拿來考過別人(蠻好玩的,大家也可以拿來問人玩),一般答案會是以下幾種:

1、true

"a" + "b" 的結果就是“ab”,這樣a,b都是“ab”了,內容一樣所以“相等”,結果true。

一般Java新人如是答。

2、false

"a" + "a"會生成新的對象“aa”,但是這個對象和String a ="ab";不同,(ab)是比較對象引用,因此不相等,結果false。

對Java的String有一定了解的通常這樣回答。

3、true

String a = "ab";創建了新的對象“ab”;再執行String b = "a"+"b";結果b="ab",這裡沒有創建新的對象,而是從JVM字符串常量池中獲取之前已經存在的“ab”對象。因此a,b具有對同一個string對象的引用,兩個引用相等,結果true。

能回答出這個答案的,基本已經是高手了,對Java中的string機制比較了解。

很遺憾,這個答案是不夠准確的。或者說,根本沒有運行時計算b = "a" + "b";這個操作。實際上運行時只有String b="ab";。

3的觀點適合解釋以下情況:

String a = "ab"; String b = "ab"; System.out.println((a b));

如果String b = "a"+"b";是在運行期執行,則3的觀點是無法解釋的。運行期的兩個string相加,會產生新的對象的。(本文後面對此有解釋)

4、true

下面是我的回答:編譯優化+ 3的處理方式 = 最後的true

String b = "a" + "b";編譯器將這個"a"+"b"作為常量表達式,在編譯時進行優化,直接取結果"ab",這樣這個問題退化。

String a = "ab"; String b = "ab"; System.out.println((a b));

然後根據3的解釋,得到結果true。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved