String類和常量池常見面試題

1、String的兩種創建方式的區別

String str1 = "abc";
String str2 = new String("abc");
sout(str1 == str2);//false

其中,第一種方式是從常量池中獲取對象,第二種方式是直接在堆內存中創建一個新的對象。 

 

2、String 類型的常量池

它的主要使用方法有兩種:

  直接使用雙引號聲明出來的 String 對象會直接存儲在常量池中。

  如果不是用雙引號聲明的 String 對象,可以使用 String 提供的 intern 方法。String.intern() 是一個 Native 方法,它的作用是:如果運行時常量池中已經包含一個等於此 String 對象內容的字符串,則返回常量池中該字符串的引用;如果沒有,則在常量池中創建與此 String 內容相同的字符串,並返回常量池中創建的字符串的引用。

String s1 = new String("計算機");
String s2 = s1.intern();
String s3 = "計算機";
System.out.println(s2);//計算機
System.out.println(s1 == s2);//false,因爲一個是堆內存中的String對象一個是常量池中的String對象,
System.out.println(s3 == s2);//true,因爲兩個都是常量池中的String對象

3 String 字符串拼接

String str1 = "str";
String str2 = "ing";
 
String str3 = "str" + "ing";//常量池中的對象
String str4 = str1 + str2; //在堆上創建的新的對象     
String str5 = "string";//常量池中的對象
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false

 

問題:

  String s1 = new String("abc"); // 這句話創建了幾個對象?

解答:

  創建了兩個對象。(一個是常量池對象,一個堆對象)

String s1 = new String("abc");// 堆內存的地值值
String s2 = "abc";
System.out.println(s1 == s2);// 輸出false,因爲一個是堆內存,一個是常量池的內存,故兩者是不同的。
System.out.println(s1.equals(s2));// 輸出true

解釋:

  先有字符串 “abc” 放入常量池,然後 new 了一份字符串 “abc” 放入 Java 堆(字符串常量 “abc” 在編譯期就已經確定放入常量池,而 Java 堆上的 “abc” 是在運行期初始化階段才確定),然後 Java 棧的 str1 指向 Java 堆上的 “abc”。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章