參考鏈接: 比較Java中的兩個字符串String
最近很多學習java的小白問我字串相關的問題,覺得很有必要整理下,以方便初學者理解字符串以及應對今后面試中考官的提問。?
如果你是有幾年Java開發經驗,可以根據目錄選擇性的閱讀以下內容,并歡迎留言補充。?
問題列表如下:?
0.String是最基本的數據類型嗎? 1.String是否可以被繼承? 2.Java中的String a = "abc"和String a = new String("abc")的區別? 3.為什么字符串是不可變的? 4.什么是String常量池? 5.使用字符串初始化代碼:String a = new String("abc");創建多少個對象? 6.String類中intern()的作用? 7.使用equals()和'=='進行字符串比較的差異? 8.String StringBuffer StringBuilder 三者各自線程安全性如何? 9.String,StringBuffer以及StringBuilder之間的區別? 10.如何連接多個字符串。 11.如何分割一個String? 12.如何判斷兩個String是否相等? 13.String類中,字符串長度是否有限制? 14.Java String “+”連接符拼接字符串原理??
0.String是最基本的數據類型嗎? Java中基本數據類型包括byte,int,char,long,float,double,boolean,short一共八個;String是定義在 java.lang 包下的一個類。它不是基本數據類型。?
1.String是否可以被繼承? 不可以,因為String類似final類。?
2.Java中的String a = "abc"和String a = new String("abc")的區別? String a = "abc" 使用常量進行初始化,初始化后內存存儲在String常量池中 String a = new String("abc") 創建字符串對象,JVM創建字符串對象但不存儲于字符串池。?
3.為什么字符串是不可變的? 因為String類似final類。?
4.什么是String常量池? 字符串池是一個特殊的內存區域,與存儲這些字符串常量的常規堆內存分開。這些對象在應用程序的生命周期中被稱為字符串變量。 如:雙引號直接創建的字串,String a = "abc",會將"abc"存儲在該區域。?
5.使用字符串初始化代碼:String a = new String("abc");創建多少個對象? 上面一行代碼將會創建1或2個字符串。如果在字符串常量池中已經有一個字符串“abc”,那么就只會創建一個“abc”字符串。如果字符串常量池中沒有“abc”,那么首先會在字符串池中創建,然后才在堆內存中創建,這種情況就會創建2個對象了。?
6.String類中intern()的作用??
作用:返回字符串對象的規范表示。 調用該方法時,如果池已包含String與equals(Object)方法確定的此對象相等的字符串,則返回池中的字符串。否則,將此String對象添加到池中,并String返回對此對象的引用。 它遵循對于任何兩個字符串s和t,s.intern()==t.intern()是true當且僅當s.equals(t)是true。意味著如果s和t都是不同的字符串對象并且具有相同的字符序列,則在兩者上調用intern()將導致由兩個變量引用的單個字符串池文字。?
典型考題:?
String s1 = new String("ab") + new String("c");
s1.intern();因為此時常量池沒有"abc",會將s3指向常量"abc"
String s2 = "abc";
System.out.println(s1 == s2);//true
?
String s3 = new String("de") + new String("f");
String s4 = "def";
s3.intern();// 因為此時常量池有"def",不會將s3指向常量"def"
System.out.println(s3 == s4);// false
?
String s5 = "ghi";
String s6 = new String("ghi");
s6.intern();// 因為此時常量池有"ghi",不會將s6指向常量"ghi"
System.out.println(s5 == s6);//false?
7.使用equals和'=='進行字符串比較的差異? 字串中equals是重寫的一個方法,比較字符串中value字符數組中字符是否一致,即比較的是字符串的值,==不僅比較字符串的值,而且還比較兩個字符串所在內存地址是否相同。?
8.String StringBuffer StringBuilder 三者各自線程安全性如何? String? StringBuffer線程安全,StringBuilder非線程安全。?
9.String,StringBuffer以及StringBuilder之間的區別? String是值不可變類,每次在String對象上的操作都會生成一個新的對象;StringBuffer和StringBuilder則允許在原來對象上進行操作,而不用每次增加對象;StringBuffer是線程安全的,但效率較低,而StringBuilder效率最高,但非線程安全。?
10.如何連接多個字符串。 String:通過解讀Java API,可以知道Java為字符串連接運算提供特殊支持。 字符串連接是通過StringBuilder (或StringBuffer )類及其append方法實現的。 StringBuffer:使用append實現 StringBuilder:使用append實現。?
11.如何分割一個String? 可以使用字串分隔函數:public String[] split(String regex),根據傳入的正則字符串進行分割,注意,如果最后一位剛好有傳入的字符,返回數組最后一位不會有空字符串。?
12.如何判斷兩個String是否相等? 有兩種方式判斷字符串是否相等,使用"=="或者使用equals方法。當使用"=="操作符時,不僅比較字符串的值,還會比較引用的內存地址。大多數情況下,我們只需要判斷值是否相等,此時用equals方法比較即可。 還有一個equalsIgnoreCase可以用來忽略大小寫進行字符串值比較。?
13.String類中,字符串長度是否有限制? 可以看字符串類的源碼,字符串使用char數組存放字符,該字符數組為定義最大長度,故,理論上來說String是沒有長度限制的,限制的是你的內存有多大。?
14.Java String “+”連接符拼接字符串原理? String字符串拼接通過StringBuilder走中間過程,通過append方法實現。?
程序有大量字符串拼接時,建議直接StringBuilder實現,就不需要底層new很多臨時String對象了。注意null參與拼接時會變成字符串"null"。?
相關問題持續更新匯總,逐步添加代碼及更詳細的原理解析。