1. 程式人生 > >比較全的關於String型別的 == 問題

比較全的關於String型別的 == 問題

String a = “a”; String b = new String(“a”); // ① String c = “a”+”“;// ② String d = String.valueOf(a);//③ String e = a+”“;//④ final String f = “a”;//⑤ String g =f+”“; //⑥

首先,“==”操作符是對於int型對比的是數值,對於其他型別對比的是地址 ① a != b; 因為String 型別的兩種初始化方式不同,String a =”a”初始化是在方法區中的常量池中開闢一個“a”; String b = new String(“a”)初始化實在堆中new出一個String型別的,值為“a”的物件b 不同位置當然就是不同地址。 ② a == c; “a”+”“字串拼接後仍是”a”,在常量池已經有了一席之地,不用另外開闢空間 所以a,c指向的是同一個”a”。 ③ a == d; 這個是今天面試才知道的,String.valueOf的返回值是toString,而a本身的資料型別就是String 且String型別的toString的返回值就是自己本身 所以a,d又指向了同一個”a”。 ④ a != e; 因為在這個語句的處理中,a是被當作物件連結來訪問的,返回的也是值為”a”的物件。 ⑤ a ==f; f指向的也是在常量池中的”a”,只不過是個final,不能被改變。 ⑥ a==g; 因為f是final的,相當於C語言中的define巨集定義,在編譯預處理的過程中,String g =f+”“; 中的f被直接替換為”a”,故結果同②。

由於能力有限,個人理解的就到這裡了,這是第一篇文章,以後我會加油的!如果還有補充,歡迎留言