標籤:chm mon append details 存在 start 第一個 cli end
先看下面2個程式
[java] view plain copy
- public static void main(String[] args) {
- String a = "a1";
- String b = "a" + 1;
- System.out.println(a == b);
- }
[java] view plain copy
- public static void main(String[] args) {
- String a = "a1";
- String b = "1";
- String c = "a" + b;
- System.out.println(a == c);
- }
第一個程式輸出是true,由於“a” 和1算是字串常量,所以在編譯期b的值就確定了,在運行期不會產生StringBuilder對象,所以在運行期,由於“a1“已經在String Pool中存在, 所以對象”a1“的引用同時指向a和b。
第二個程式中輸出是false。因為在運行期才能確定"a"+b的值,所以為了提高效率,在運行期會產生一個StringBuilder對象,對它調用append方法,最後調用toString()方法,返回一個String對象的引用。
下面開始說幾個面試題:
1.
[java] view plain copy
- public static void main(String[] args) {
- //列印true,原因見上面分析
- String a = "a1";
- String b = "a" + 1;
- System.out.println(a == b);
- }
2
[java] view plain copy
- public static void main(String[] args) {
- //列印false,原因見上面分析
- String a = "ab";
- String bb = "b";
- String b = "a" + bb;
- System.out.println(a == b);
- }
3.
[java] view plain copy
- public static void main(String[] args) {
- //列印true,final說明bb始終指向”b“,不能把其他對象的引用給bb,所以,在編譯期,bb的值是確定的,即
- //"a" + bb的值也是確定的,所以和上面1同理
- String a = "ab";
- final String bb = "b";
- String b = "a" + bb;
- System.out.println(a == b);
- }
4
[java] view plain copy
- public static void main(String[] args) {
- //列印false, 簡言之,就是編譯期不能確定,在運行期才能確定,因此會產生StringBulder對象,通過toSring()返回一個String
- //的引用,肯定他a和b的記憶體位址是不同的。
- String a = "ab";
- final String bb = getBB();
- String b = "a" + bb;
- System.out.println(a == b);
- }
-
- private static String getBB() {
- return "b";
- }
5
[java] view plain copy
- public class Test {
- private static String a = "ab";
-
- public static void main(String[] args) {
- //列印false,true, static資料放在方法區中,其他和不是static的變臉一樣
- String s1 = "a";
- String s2 = "b";
- String s = s1 + s2;
- System.out.println(s == a);
- System.out.println(s.intern() == a);
- }
- }
分析圖如下:
6
[java] view plain copy
- public class Test {
- private static String a = new String("ab");
-
- public static void main(String[] args) {
- //列印false,false,true。分析看後面的分析圖
- String s1 = "a";
- String s2 = "b";
- String s = s1 + s2;
- System.out.println(s == a);
- System.out.println(s.intern() == a);
- System.out.println(s.intern() == a.intern());
-
- }
- }
Java字串面試(二)