群友在微信群讨論的一個話題,有點意思,特拿出來分享一下。
首先來看下面這段程式,和群友分享的大緻一樣。
public static void main(String[] args) {
String hw = "hello world";
String hello = "hello";
final String finalWorld2 = "hello";
final String finalWorld3 = hello;
final String finalWorld4 = "he" + "llo";
String hw1 = hello + " world";
String hw2 = finalWorld2 + " world";
String hw3 = finalWorld3 + " world";
String hw4 = finalWorld4 + " world";
System.out.println(hw == hw1);
System.out.println(hw == hw2);
System.out.println(hw == hw3);
System.out.println(hw == hw4);
}
程式輸出:
false
true
false
true
同樣是字元串”hello”,為什麼用final定義的,且個進行==操作卻是true有一個是false,而沒用final的卻是false?
首先來了解下宏變量:
Java中,一個用final定義的變量,不管它是類型的變量,隻要用final定義了并同時指定了初始值,并且這個初始值是在編譯時就被确定下來的,那麼這個final變量就是一個宏變量。編譯器會把程式所有用到該變量的地方直接替換成該變量的值,也就是說編譯器能對宏變量進行宏替換。
如:
final String a = "hello";
final String b = a;
final String c = getHello();
a在編譯期間就能确定下來,而b、c不行,是以a是宏變量,b、c不是。
是以,再回到上面的程式,finalWorld2和finalWorld4是final定義的,也是在編譯期間能确定下來的,是以它能被宏替換,編譯器就會讓finalWorld2和finalWorld4指向字元串池中緩存的字元串”“hello world”,是以它們就是同一個對象。